<< TP 7
TP 9 >>

8. Lister, Supprimer un Véhicule





On se base sur le même modèle que le conducteur.

8.1. L'entité Véhicule

  1. <?php
  2. namespace App\Entity;
  3.  
  4. use Doctrine\ORM\Mapping as ORM;
  5. use Doctrine\Common\Collections\ArrayCollection;
  6. use Doctrine\Common\Collections\Collection;
  7.  
  8. // on a besoin de conducteur car un véhicule est associé
  9. // à un conducteur
  10. use App\Entity\Conducteur;
  11.  
  12. use App\Repository\VehiculeRepository;
  13.  
  14. // for date
  15. use Symfony\Component\Validator\Constraints as Assert;
  16.  
  17.  
  18. #[ORM\Entity(repositoryClass: VehiculeRepository::class)]
  19. class Vehicule
  20. {
  21.     // --------------------------------------------------------------
  22.     // Description des champs
  23.     // --------------------------------------------------------------
  24.  
  25.     #[ORM\Id]
  26.    #[ORM\GeneratedValue]
  27.    #[ORM\Column(type: 'integer')]
  28.    private ?int $ve_id = null;
  29.  
  30.     #[ORM\Column(type:'string', length:30)]
  31.    private ?string $ve_marque = null;
  32.  
  33.     #[ORM\Column(type:'string', length:30)]
  34.    private ?string $ve_modele = null;
  35.  
  36.     #[ORM\Column(type: "datetime", nullable: true)]
  37.    #[Assert\NotBlank]
  38.    #[Assert\NotNull]
  39.    private  $ve_date;
  40.  
  41.     // relation vers Conducteur : un véhicule possède un seul conducteur
  42.     #[ORM\ManyToOne(targetEntity : Conducteur::class, inversedBy: "vehicules")]
  43.    #[ORM\JoinColumn(nullable:false, name: 've_co_id', referencedColumnName: 'co_id')]
  44.    private Conducteur $ve_conducteur;
  45.  
  46.     // --------------------------------------------------------------
  47.     // Methodes
  48.     // --------------------------------------------------------------
  49.  
  50.     public function __construct()
  51.     {
  52.         $this->ve_date = new \DateTime();
  53.     }
  54.  
  55.     function getVeId() {
  56.  
  57.         return $this->ve_id;
  58.  
  59.     }
  60.  
  61.     function getVeMarque() {
  62.  
  63.         return $this->ve_marque;
  64.  
  65.     }
  66.  
  67.     function setVeMarque($marque) {
  68.  
  69.         $this->ve_marque = $marque;
  70.    
  71.         return $this;
  72.    
  73.     }
  74.  
  75.     function getVeModele() {
  76.  
  77.         return $this->ve_modele;
  78.  
  79.     }
  80.  
  81.     function setVeModele($modele) {
  82.  
  83.         $this->ve_modele = $modele;
  84.    
  85.         return $this;
  86.    
  87.     }
  88.  
  89.     public function getVeDate(): ?\DateTimeInterface
  90.     {
  91.         return $this->ve_date;
  92.     }
  93.  
  94.     public function setVeDate(\DateTimeInterface $date): self
  95.     {
  96.         $this->ve_date = $date;
  97.         return $this;
  98.     }
  99.  
  100.     public function getVeConducteur(): ?Conducteur
  101.     {
  102.         return $this->ve_conducteur;
  103.     }
  104.  
  105.     public function setVeConducteur(?Conducteur $conducteur): self
  106.     {
  107.         $this->ve_conducteur = $conducteur;
  108.  
  109.         return $this;
  110.     }
  111.  
  112. }
  113.  
  114. ?>

8.2. Contrôleur pour l'entité Véhicule

On dispose du même type de route que pour le Conducteur :

  1. <?php
  2.  
  3. namespace App\Controller;
  4.  
  5. use App\Entity\Vehicule;
  6. use App\Form\VehiculeType;
  7. use App\Repository\VehiculeRepository;
  8. use App\Repository\ConducteurRepository;
  9.  
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Doctrine\ORM\EntityManagerInterface;
  15.  
  16. // Utilisation d'un logger pour le débogage
  17. use Psr\Log\LoggerInterface;
  18.  
  19. class VehiculeController extends AbstractController
  20. {
  21.     // Logger
  22.     private $logger;
  23.     private $entity_manager;
  24.     private $repository;
  25.  
  26.     /**
  27.      * Constructeur auquel on passe en paramètre un logger
  28.      */
  29.     public function __construct(LoggerInterface $logger, EntityManagerInterface $entity_manager)
  30.     {
  31.         $this->logger = $logger;
  32.         $this->entity_manager = $entity_manager;
  33.         // obtenir le Repository lié au véhicule depuis l'EntityManager
  34.         $this->repository = $entity_manager->getRepository(Vehicule::class);
  35.     }
  36.    
  37.  
  38.  
  39. }
  40.  

8.3. Repository pour l'entité Véhicule

On donne deux fonctionalités au repository lié au véhicule :

  1. <?php
  2. namespace App\Repository;
  3.  
  4. use App\Entity\Vehicule;
  5. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  6. use Doctrine\Persistence\ManagerRegistry;
  7.  
  8. /**
  9.  * @extends ServiceEntityRepository<Vehicule>
  10.  */
  11. class VehiculeRepository extends ServiceEntityRepository
  12. {
  13.     /**
  14.      * Constructeur
  15.      */
  16.     public function __construct(ManagerRegistry $registry)
  17.     {
  18.         parent::__construct($registry, Vehicule::class);
  19.     }
  20.  
  21.     /**
  22.      * Sauvegarde dans la base de donnée
  23.      */
  24.     public function save(Vehicule $vehicule, bool $flush = false): void
  25.     {
  26.         $this->getEntityManager()->persist($vehicule);
  27.  
  28.         if ($flush) {
  29.             $this->getEntityManager()->flush();
  30.         }
  31.     }
  32.  
  33.     /**
  34.      * @return Vehicule[]
  35.      *
  36.      * Retourne un tableau de Vehicule classés suivant la marque ($ve_Marque)
  37.      * puis le modèle ($ve_modele)
  38.      */
  39.     public function findAllOrdered()
  40.     {
  41.         $r = $this->createQueryBuilder('c')
  42.             ->orderBy('c.ve_marque', 'ASC')
  43.             ->addOrderBy('c.ve_modele', 'ASC')
  44.             ->getQuery()
  45.             ->getResult();
  46.         return $r;
  47.     }
  48. }
  49.  
  50. ?>
  51.  

8.4. Lister les véhicules

Pour lister les véhicules il faut ajouter la fonction adéquate au niveau du contrôleur :

  1. <?php
  2. // ...
  3.  
  4. class VehiculeController extends AbstractController
  5. {
  6.     #[Route('/vehicule/lister', name: 'vehicule_lister')]
  7.    public function lister(Request $request): Response
  8.     {
  9.         $liste_vehicules = $vehicule_repository->findAllOrdered();
  10.  
  11.         return $this->render("vehicule/lister.html.twig", [
  12.             'liste_vehicules' => $liste_vehicules
  13.         ]);
  14.     }
  15.  
  16. }
  17.  

On réalise une énumération des véhicules (bloucle for) avec la variable e (pour élément) et on affichera :

  1. {% extends 'base.html.twig' %}
  2.  
  3. {% block main %}
  4.     <section>
  5.  
  6.     <h2>Véhicules</h2>
  7.  
  8.     <nav>
  9.         <ul>
  10.             <li><a href="/vehicule/creer">[+] Ajouter</a></li>
  11.             <li><a href="/vehicule/tout_supprimer">[x] Tout Supprimer</a></li>
  12.         </ul>
  13.     </nav>
  14.  
  15.     {% if vehicules_list is empty %}
  16.  
  17.         <p>Aucun véhicule trouvé.</p>
  18.  
  19.     {% else %}
  20.  
  21.     <table>
  22.         <tr>
  23.             <th style="width: 50px">Id</th>
  24.             <th style="width: 150px">Marque</th>
  25.             <th style="width: 150px">Modèle</th>
  26.             <th style="width: 150px">Conducteur</th>
  27.             <th style="width: 50px">Suppr.</th>
  28.             <th style="width: 50px">Mod.</th>
  29.            
  30.         </tr>
  31.         {% for e in vehicules_list %}
  32.             <tr>
  33.                
  34.                 <td class="center">{{ e.VeId }}</td>
  35.                 <td> {{ e.VeMarque }}</td>
  36.                 <td> {{ e.VeModele }}</td>
  37.                 <td> {{ e.VeConducteur.CoNom }}</td>
  38.                 <td class="center"><img src="{{ asset('images/delete.png') }}" alt="delete"
  39.                     onclick="return vehicule_supprimer({{ e.VeId }}, '{{ e.VeMarque }}', '{{ e.VeModele }}');" /></td>
  40.                 <td class="center"><img src="{{ asset('images/modify.png') }}" alt="modify"
  41.                     onclick="return vehicule_modifier({{ e.VeId }}, '{{ e.VeMarque }}', '{{ e.VeModele }}');" /></td>
  42.                
  43.             </tr>
  44.         {% endfor %}
  45.     </table>
  46.  
  47.     {% endif %}
  48.  
  49.     </section>
  50. {% endblock %}

8.5. Supprimer

Pour supprimer un véhicule il faut ajouter une fonction au niveau du contrôleur ainsi que la fonctionnalité permettant de supprimer tous les véhicules :

  1. <?php
  2. // ...
  3.  
  4. class VehiculeController extends AbstractController
  5. {
  6.     // ...
  7.  
  8.     /**
  9.      * Supprimer un véhicule étant donné son id
  10.      */
  11.     #[Route('/vehicule/supprimer/{id}', name: 'vehicule_supprimer')]
  12.    public function supprimer( $id ): Response
  13.     {
  14.         // Récupérer le vehicule par son id
  15.         $vehicule = $this->repository->find($id);
  16.  
  17.         if (!$vehicule) {
  18.             throw $this->createNotFoundException('Aucun véhicule avec l\'identifiant ' . $id . ' n\'a été trouvé');
  19.         }
  20.  
  21.         // Suppression du vehicule
  22.         $this->entity_manager->remove($vehicule);
  23.         $this->entity_manager->flush();
  24.  
  25.         return $this->redirectToRoute('vehicule_lister');
  26.     }
  27.  
  28.     /**
  29.      * Supprimer tous les véhicules (debug/test)
  30.      */
  31.     #[Route('/vehicule/supprimer_tout', name: 'vehicule_supprimer_tout')]
  32.    public function supprimer_tout(): Response
  33.     {
  34.         // Récupérer les vehicules
  35.         $vehicules = $this->repository->findAll();
  36.  
  37.         foreach($vehicules as $vehicule) {
  38.             $this->entity_manager->remove($vehicule);
  39.         }
  40.        
  41.         $this->entity_manager->flush();
  42.  
  43.         return $this->redirectToRoute('vehicule_lister');
  44.     }
  45.  
  46.     // ...
  47. }
  48. ?>

On notera que le véhicule est supprimé mais pas son conducteur.






<< TP 7
TP 9 >>