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.