Dopo aver analizzato nella lezione precedente come affidare a Doctrine la connessione al database e la creazione della nostra tabella, vediamo in questa parte della trattazione come utilizzarlo per effettuare le più comuni operazioni CRUD (Create, Read, Update, Delete) sulla nostra tabella.
Prima di procedere, però, abbiamo bisogno di creare un controller ad-hoc per gestire tutto quello che ha a che fare con la nostra tabella. Nella stessa maniera in cui abbiamo creato i controller nelle altre lezioni, generiamo il nostro BookController
:
namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\DemoBundle\Entity\Book;
class BookController extends Controller
{
public function indexAction()
{
}
public function createAction()
{
}
public function viewAction( $id )
{
}
public function updateAction()
{
}
public function deleteAction()
{
}
}
Impostiamo quindi le relative rotte:
_book:
path: /books/
defaults: { _controller: AcmeDemoBundle:Book:index }
_book_create:
path: /book/create
defaults: { _controller: AcmeDemoBundle:Book:create }
_book_view:
path: /book/view/{id}
defaults: { _controller: AcmeDemoBundle:Book:view }
requirements:
id: \d+
_book_update:
path: /book/update
defaults: { _controller: AcmeDemoBundle:Book:update }
_book_delete:
path: /book/delete
defaults: { _controller: AcmeDemoBundle:Book:delete }
I metodi che abbiamo creato li utilizzeremo per gestire le operazioni con il database.
La tabella book
creata, invece, aveva la seguente struttura:
Andiamo ora a gestire le operazioni CRUD con Doctrine, iniziando dal metodo create
.
Inserire un elemento nel database
La creazione di una nuova entry all'interno del database è, come tutte le altre operazioni, piuttosto semplice:
public function createAction()
{
$book = new Book();
$book->setTitle("Il Signore degli Anelli");
$book->setAuthor("John Ronald Reuel Tolkien");
$book->setIsbn("88-452-9005-0");
$book->setPrice("22.00");
$book->setDescription("Un mondo sul ciglio dell'abisso, un pugno di eroi capaci di opporsi al male. Una pietra miliare della letteratura di tutti i tempi.");
$em = $this->getDoctrine()->getManager();
$em->persist($book);
$em->flush();
return $this->render(
'AcmeDemoBundle:Book:create.html.twig',
array(
'book' => $book
)
);
}
Se guardiamo il codice, abbiamo utilizzato i metodi setter che ha creato Doctrine per noi nella lezione precedente e poi utilizzato l'entity manager per persistere i dati nel database. Ora analizziamo nel particolare questo specifico snippet di codice:
$em = $this->getDoctrine()->getManager();
$em->persist($book);
$em->flush();
La prima operazione che eseguiamo è quella di richiamare l'entity manager di Doctrine. Notiamo come Doctrine venga richiamato all'interno del controllore come metodo dell'istanza ($this->getDoctrine()
). Questo avviene grazie alla Dependency Injection che vedremo più avanti nel corso.
Abbiamo poi utilizzato il metodo persist
con cui comunichiamo a Doctrine che l'oggetto appena creato necessita di essere gestito, infine, abbiamo introdotto il metodo flush()
che effettivamente si occuperà di inserire l'oggetto nel database.
Il metodo flush
è una funzione che si occupa di determinare tutte le query che vanno eseguite in un determinato momento all'interno del database e si occupa di eseguirle cercando di ottimizzarle ed effettuare il minimo numero di operazioni necessarie.
Una volta creata la entry nel database, possiamo mostrare a schermo le info del libro appena inserito. All'interno del file Resources/views/Book/create.html.twig
creiamo quindi una tabella contenente le informazioni:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Libro creato correttamente!</h1>
<p>Di seguito i dati del libro inserito:</p>
<table>
<thead>
<tr>
<th>Titolo</th>
<th>Autore</th>
<th>ISBN</th>
<th>Descrizione</th>
<th>Prezzo</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ book.title }}</td>
<td>{{ book.author }}</td>
<td>{{ book.isbn }}</td>
<td>{{ book.description }}</td>
<td>{{ book.price }}</td>
</tr>
</tbody>
</table>
</body>
</html>
Ora che è stato effettuato un primo inserimento di dati nella tabella, potremo proseguire con l'analisi delle operazioni per la manipolazione dei dati secondo lo schema CRUD con Doctrine e Symfony 2 (lettura, selezione, cancellazione..), argomenti che verranno affrontati nel corso della prossima lezione.