Symfony - Esempio di lavoro
In questo capitolo impareremo come creare un completo basato su MVC BookStore Applicationin Symfony Framework. Di seguito sono riportati i passaggi.
Passaggio 1: crea un progetto
Creiamo un nuovo progetto chiamato "BookStore" in Symfony usando il seguente comando.
symfony new BookStore
Passaggio 2: creare un controller e un percorso
Crea un BooksController nella directory "src / AppBundle / Controller". È definito come segue.
BooksController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BooksController {
/**
* @Route("/books/author")
*/
public function authorAction() {
return new Response('Book store application!');
}
}
Ora, abbiamo creato un BooksController, quindi creiamo una vista per eseguire il rendering dell'azione.
Passaggio 3: crea una vista
Creiamo una nuova cartella denominata "Books" nella directory "app / Resources / views /". All'interno della cartella, crea un file "author.html.twig" e aggiungi le seguenti modifiche.
author.html.twig
<h3> Simple book store application</h3>
Eseguire ora il rendering della vista nella classe BooksController. È definito come segue.
BooksController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BooksController extends Controller {
/**
* @Route("/books/author")
*/
public function authorAction() {
return $this->render('books/author.html.twig');
}
}
A partire da ora, abbiamo creato un BooksController di base e il risultato viene visualizzato. È possibile controllare il risultato nel browser utilizzando l'URL "http: // localhost: 8000 / books / author".
Passaggio 4: configurazione del database
Configura il database nel file "app / config / parameters.yml".
Apri il file e aggiungi le seguenti modifiche.
parametro.yml
# This file is auto-generated during the composer install
parameters:
database_driver: pdo_mysql
database_host: localhost
database_port: 3306
database_name: booksdb
database_user: <database_username>
database_password: <database_password>
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
secret: 0ad4b6d0676f446900a4cb11d96cf0502029620d
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: utf8mb4
Ora Doctrine può connettersi al tuo database "booksdb".
Passaggio 5: creare un database
Immettere il seguente comando per generare il database "booksdb". Questo passaggio viene utilizzato per collegare il database in Doctrine.
php bin/console doctrine:database:create
Dopo aver eseguito il comando, genera automaticamente un database "booksdb" vuoto. Puoi vedere la seguente risposta sullo schermo.
Produrrà il seguente risultato:
Created database `booksdb` for connection named default
Passaggio 6: informazioni sulla mappatura
Crea una classe di entità Book all'interno della directory Entity che si trova in "src / AppBundle / Entity".
Puoi passare direttamente alla classe Book usando le annotazioni. È definito come segue.
Book.php
Aggiungi il seguente codice nel file.
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name = "Books")
*/
class Book {
/**
* @ORM\Column(type = "integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy = "AUTO")
*/
private $id;
/**
* @ORM\Column(type = "string", length = 50)
*/
private $name;
/**
* @ORM\Column(type = "string", length = 50)
*/
private $author;
/**
* @ORM\Column(type = "decimal", scale = 2)
*/
private $price;
}
Qui, il nome della tabella è facoltativo.
Se il nome della tabella non è specificato, verrà determinato automaticamente in base al nome della classe di entità.
Passaggio 7: associare un'entità
Doctrine crea semplici classi di entità per te. Ti aiuta a costruire qualsiasi entità.
Emetti il seguente comando per generare un'entità.
php bin/console doctrine:generate:entities AppBundle/Entity/Book
Quindi vedrai il seguente risultato e l'entità verrà aggiornata.
Generating entity "AppBundle\Entity\Book”
> backing up Book.php to Book.php~
> generating AppBundle\Entity\Book
Book.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name = "Books")
*/
class Book {
/**
* @ORM\Column(type = "integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy = "AUTO")
*/
private $id;
/**
* @ORM\Column(type = "string", length = 50)
*/
private $name;
/**
* @ORM\Column(type = "string", length = 50)
*/
private $author;
/**
* @ORM\Column(type = "decimal", scale = 2)
*/
private $price;
/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Book
*/
public function setName($name) {
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName() {
return $this->name;
}
/**
* Set author
*
* @param string $author
*
* @return Book
*/
public function setAuthor($author) {
$this->author = $author;
return $this;
}
/**
* Get author
*
* @return string
*/
public function getAuthor() {
return $this->author;
}
/**
* Set price
*
* @param string $price
*
* @return Book
*/
public function setPrice($price) {
$this->price = $price;
return $this;
}
/**
* Get price
*
* @return string
*/
public function getPrice() {
return $this->price;
}
}
Passaggio 8: convalida della mappatura
Dopo aver creato le entità, è necessario convalidare le mappature utilizzando il seguente comando.
php bin/console doctrine:schema:validate
Produrrà il seguente risultato:
[Mapping] OK - The mapping files are correct
[Database] FAIL - The database schema is not in sync with the current mapping file.
Poiché non abbiamo creato la tabella Libri, l'entità non è sincronizzata. Creiamo la tabella Libri usando il comando Symfony nel passaggio successivo.
Passaggio 9: creazione dello schema
Doctrine può creare automaticamente tutte le tabelle di database necessarie per l'entità Libro. Questo può essere fatto usando il seguente comando.
php bin/console doctrine:schema:update --force
Dopo aver eseguito il comando, vedrai la seguente risposta.
Updating database schema...
Database schema updated successfully! "1" query was executed
Ora convalida nuovamente lo schema utilizzando il seguente comando.
php bin/console doctrine:schema:validate
Produrrà il seguente risultato:
[Mapping] OK - The mapping files are correct.
[Database] OK - The database schema is in sync with the mapping files.
Passaggio 10: Getter e Setter
Come visto nella sezione Bind an Entity, il seguente comando genera tutti i getter e setter per la classe Book.
$ php bin/console doctrine:generate:entities AppBundle/Entity/Book
Passaggio 11: recupero di oggetti dal database
Crea un metodo in BooksController che visualizzerà i dettagli dei libri.
BooksController.php
/**
* @Route("/books/display", name="app_book_display")
*/
public function displayAction() {
$bk = $this->getDoctrine()
->getRepository('AppBundle:Book')
->findAll();
return $this->render('books/display.html.twig', array('data' => $bk));
}
Passaggio 12: creare una vista
Creiamo una vista che punti a visualizzare l'azione. Spostati nella directory delle visualizzazioni e crea il file "display.html.twig". Aggiungi le seguenti modifiche al file.
display.html.twig
{% extends 'base.html.twig' %}
{% block stylesheets %}
<style>
.table { border-collapse: collapse; }
.table th, td {
border-bottom: 1px solid #ddd;
width: 250px;
text-align: left;
align: left;
}
</style>
{% endblock %}
{% block body %}
<h2>Books database application!</h2>
<table class = "table">
<tr>
<th>Name</th>
<th>Author</th>
<th>Price</th>
</tr>
{% for x in data %}
<tr>
<td>{{ x.Name }}</td>
<td>{{ x.Author }}</td>
<td>{{ x.Price }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
È possibile ottenere il risultato richiedendo l'URL "http: // localhost: 8000 / books / display" nel browser.
Risultato
Passaggio 13: aggiungere un modulo libro
Creiamo una funzionalità per aggiungere un libro nel sistema. Creare una nuova pagina, metodo newAction nel BooksController come segue.
// use section
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
// methods section
/**
* @Route("/books/new")
*/
public function newAction(Request $request) {
$stud = new StudentForm();
$form = $this->createFormBuilder($stud)
->add('name', TextType::class)
->add('author', TextType::class)
->add('price', TextType::class)
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
return $this->render('books/new.html.twig', array('form' => $form->createView(),));
}
Passaggio 14: creare una vista per il modulo del libro
Creiamo una vista che punti a una nuova azione. Spostati nella directory delle visualizzazioni e crea un file "new.html.twig". Aggiungi le seguenti modifiche al file.
{% extends 'base.html.twig' %}
{% block stylesheets %}
<style>
#simpleform {
width:600px;
border:2px solid grey;
padding:14px;
}
#simpleform label {
font-size:14px;
float:left;
width:300px;
text-align:right;
display:block;
}
#simpleform span {
font-size:11px;
color:grey;
width:100px;
text-align:right;
display:block;
}
#simpleform input {
border:1px solid grey;
font-family:verdana;
font-size:14px;
color:light blue;
height:24px;
width:250px;
margin: 0 0 10px 10px;
}
#simpleform textarea {
border:1px solid grey;
font-family:verdana;
font-size:14px;
color:light blue;
height:120px;
width:250px;
margin: 0 0 20px 10px;
}
#simpleform select {
margin: 0 0 20px 10px;
}
#simpleform button {
clear:both;
margin-left:250px;
background: grey;
color:#FFFFFF;
border:solid 1px #666666;
font-size:16px;
}
</style>
{% endblock %}
{% block body %}
<h3>Book details:</h3>
<div id = "simpleform">
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
</div>
{% endblock %}
Produrrà la seguente schermata come output:
Passaggio 15: raccogliere informazioni sul libro e archiviarle
Cambiamo il metodo newAction e includiamo il codice per gestire l'invio del modulo. Inoltre, memorizzare le informazioni sul libro nel database.
/**
* @Route("/books/new", name="app_book_new")
*/
public function newAction(Request $request) {
$book = new Book();
$form = $this->createFormBuilder($book)
->add('name', TextType::class)
->add('author', TextType::class)
->add('price', TextType::class)
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$book = $form->getData();
$doct = $this->getDoctrine()->getManager();
// tells Doctrine you want to save the Product
$doct->persist($book);
//executes the queries (i.e. the INSERT query)
$doct->flush();
return $this->redirectToRoute('app_book_display');
} else {
return $this->render('books/new.html.twig', array(
'form' => $form->createView(),
));
}
}
Una volta che il libro è stato memorizzato nel database, reindirizza alla pagina di visualizzazione del libro.
Passaggio 16: aggiornamento del libro
Per aggiornare il libro, crea un'azione, updateAction e aggiungi le seguenti modifiche.
/**
* @Route("/books/update/{id}", name = "app_book_update" )
*/
public function updateAction($id, Request $request) {
$doct = $this->getDoctrine()->getManager();
$bk = $doct->getRepository('AppBundle:Book')->find($id);
if (!$bk) {
throw $this->createNotFoundException(
'No book found for id '.$id
);
}
$form = $this->createFormBuilder($bk)
->add('name', TextType::class)
->add('author', TextType::class)
->add('price', TextType::class)
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$book = $form->getData();
$doct = $this->getDoctrine()->getManager();
// tells Doctrine you want to save the Product
$doct->persist($book);
//executes the queries (i.e. the INSERT query)
$doct->flush();
return $this->redirectToRoute('app_book_display');
} else {
return $this->render('books/new.html.twig', array(
'form' => $form->createView(),
));
}
}
Qui stiamo elaborando due funzionalità. Se la richiesta contiene solo id, la recuperiamo dal database e la mostriamo nel modulo del libro. Inoltre, se la richiesta contiene informazioni complete sul libro, aggiorniamo i dettagli nel database e reindirizziamo alla pagina di visualizzazione del libro.
Passaggio 17: eliminazione di un oggetto
L'eliminazione di un oggetto richiede una chiamata al metodo remove () del gestore entità (doctrine).
Questo può essere fatto usando il codice seguente.
/**
* @Route("/books/delete/{id}", name="app_book_delete")
*/
public function deleteAction($id) {
$doct = $this->getDoctrine()->getManager();
$bk = $doct->getRepository('AppBundle:Book')->find($id);
if (!$bk) {
throw $this->createNotFoundException('No book found for id '.$id);
}
$doct->remove($bk);
$doct->flush();
return $this->redirectToRoute('app_book_display');
}
Qui abbiamo eliminato il libro e reindirizzato alla pagina di visualizzazione del libro.
Passaggio 18: includere funzionalità di aggiunta / modifica / eliminazione nella pagina di visualizzazione
Ora aggiorna il blocco del corpo nella visualizzazione di visualizzazione e includi i collegamenti di aggiunta / modifica / eliminazione come segue.
{% block body %}
<h2>Books database application!</h2>
<div>
<a href = "{{ path('app_book_new') }}">Add</a>
</div>
<table class = "table">
<tr>
<th>Name</th>
<th>Author</th>
<th>Price</th>
<th></th>
<th></th>
</tr>
{% for x in data %}
<tr>
<td>{{ x.Name }}</td>
<td>{{ x.Author }}</td>
<td>{{ x.Price }}</td>
<td><a href = "{{ path('app_book_update', { 'id' : x.Id }) }}">Edit</a></td>
<td><a href = "{{ path('app_book_delete', { 'id' : x.Id }) }}">Delete</a></td>
</tr>
{% endfor %}
</table>
{% endblock %}
Produrrà la seguente schermata come output:
Symfony comprende un insieme di componenti PHP, un framework applicativo, una comunità e una filosofia. Symfony è estremamente flessibile e in grado di soddisfare tutte le esigenze di utenti avanzati, professionisti e una scelta ideale per tutti i principianti con PHP.