Symfony - Exemple de travail

Dans ce chapitre, nous allons apprendre à créer un MVC complet BookStore Applicationdans Symfony Framework. Voici les étapes.

Étape 1: créer un projet

Créons un nouveau projet nommé «BookStore» dans Symfony en utilisant la commande suivante.

symfony new BookStore

Étape 2: créer un contrôleur et une route

Créez un BooksController dans le répertoire «src / AppBundle / Controller». Il est défini comme suit.

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!'); 
   } 
}

Maintenant, nous avons créé un BooksController, puis créons une vue pour rendre l'action.

Étape 3: créer une vue

Créons un nouveau dossier nommé «Books» dans le répertoire «app / Resources / views /». Dans le dossier, créez un fichier «author.html.twig» et ajoutez les modifications suivantes.

author.html.twig

<h3> Simple book store application</h3>

Maintenant, affichez la vue dans la classe BooksController. Il est défini comme suit.

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'); 
   } 
}

À partir de maintenant, nous avons créé un BooksController de base et le résultat est rendu. Vous pouvez vérifier le résultat dans le navigateur en utilisant l'URL «http: // localhost: 8000 / books / author».

Étape 4: Configuration de la base de données

Configurez la base de données dans le fichier «app / config / parameters.yml».

Ouvrez le fichier et ajoutez les modifications suivantes.

paramètre.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

Maintenant, Doctrine peut se connecter à votre base de données «booksdb».

Étape 5: créer une base de données

Exécutez la commande suivante pour générer la base de données «booksdb». Cette étape est utilisée pour lier la base de données dans Doctrine.

php bin/console doctrine:database:create

Après avoir exécuté la commande, il génère automatiquement une base de données vide «booksdb». Vous pouvez voir la réponse suivante sur votre écran.

Il produira le résultat suivant -

Created database `booksdb` for connection named default

Étape 6: Informations cartographiques

Créez une classe d'entité Book dans le répertoire Entity qui se trouve dans «src / AppBundle / Entity».

Vous pouvez passer directement la classe Book à l'aide d'annotations. Il est défini comme suit.

Book.php

Ajoutez le code suivant dans le fichier.

<?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; 
}

Ici, le nom de la table est facultatif.

Si le nom de la table n'est pas spécifié, il sera déterminé automatiquement en fonction du nom de la classe d'entité.

Étape 7: Lier une entité

Doctrine crée des classes d'entités simples pour vous. Cela vous aide à construire n'importe quelle entité.

Exécutez la commande suivante pour générer une entité.

php bin/console doctrine:generate:entities AppBundle/Entity/Book

Ensuite, vous verrez le résultat suivant et l'entité sera mise à jour.

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; 
   } 
}

Étape 8: Validation du mappage

Après avoir créé des entités, vous devez valider les mappages à l'aide de la commande suivante.

php bin/console doctrine:schema:validate

Il produira le résultat suivant -

[Mapping]  OK - The mapping files are correct
[Database] FAIL - The database schema is not in sync with the current mapping file.

Comme nous n'avons pas créé la table Books, l'entité n'est pas synchronisée. Créons la table Books à l'aide de la commande Symfony à l'étape suivante.

Étape 9: Création du schéma

Doctrine peut créer automatiquement toutes les tables de base de données nécessaires à l'entité Book. Cela peut être fait en utilisant la commande suivante.

php bin/console doctrine:schema:update --force

Après avoir exécuté la commande, vous verrez la réponse suivante.

Updating database schema... 
Database schema updated successfully! "1" query was executed

Maintenant, validez à nouveau le schéma à l'aide de la commande suivante.

php bin/console doctrine:schema:validate

Il produira le résultat suivant -

[Mapping]  OK - The mapping files are correct. 
[Database] OK - The database schema is in sync with the mapping files.

Étape 10: Getter et Setter

Comme indiqué dans la section Lier une entité, la commande suivante génère tous les getters et setters pour la classe Book.

$ php bin/console doctrine:generate:entities AppBundle/Entity/Book

Étape 11: Récupération d'objets de la base de données

Créez une méthode dans BooksController qui affichera les détails des livres.

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)); 
}

Étape 12: créer une vue

Créons une vue qui pointe vers l'action d'affichage. Allez dans le répertoire views et créez le fichier «display.html.twig». Ajoutez les modifications suivantes dans le fichier.

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 %}

Vous pouvez obtenir le résultat en demandant l'URL «http: // localhost: 8000 / books / display» dans le navigateur.

Résultat

Étape 13: Ajouter un formulaire de livre

Créons une fonctionnalité pour ajouter un livre dans le système. Créez une nouvelle page, méthode newAction dans le BooksController comme suit.

// 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(),)); 
}

Étape 14: Créer une vue pour le formulaire de livre

Créons une vue qui pointe vers une nouvelle action. Allez dans le répertoire views et créez un fichier «new.html.twig». Ajoutez les modifications suivantes dans le fichier.

{% 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 %}

Il produira l'écran suivant en sortie -

Étape 15: Collectez les informations sur le livre et stockez-les

Modifions la méthode newAction et incluons le code pour gérer la soumission du formulaire. Stockez également les informations du livre dans la base de données.

/**
   * @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(), 
      )); 
   } 
}

Une fois le livre stocké dans la base de données, redirigez vers la page d'affichage du livre.

Étape 16: Mise à jour du livre

Pour mettre à jour le livre, créez une action, updateAction et ajoutez les modifications suivantes.

/** 
   * @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(), 
      )); 
   } 
}

Ici, nous traitons deux fonctionnalités. Si la demande ne contient que l'identifiant, nous le récupérons dans la base de données et le montrons sous forme de livre. Et, si la demande contient des informations complètes sur le livre, nous mettons à jour les détails dans la base de données et nous redirigeons vers la page d'affichage du livre.

Étape 17: Suppression d'un objet

La suppression d'un objet nécessite un appel à la méthode remove () du gestionnaire d'entités (doctrine).

Cela peut être fait en utilisant le code suivant.

/** 
   * @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'); 
}

Ici, nous avons supprimé le livre et redirigé vers la page d'affichage du livre.

Étape 18: Inclure la fonctionnalité Ajouter / Modifier / Supprimer dans la page d'affichage

Maintenant, mettez à jour le bloc de corps dans la vue d'affichage et incluez les liens d'ajout / modification / suppression comme suit.

{% 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 %}

Il produira l'écran suivant en sortie -

Symfony comprend un ensemble de composants PHP, un cadre d'application, une communauté et une philosophie. Symfony est extrêmement flexible et capable de répondre à toutes les exigences des utilisateurs avancés, des professionnels et un choix idéal pour tous les débutants avec PHP.