8. Lister, Supprimer un Véhicule
On se base sur le même modèle que le conducteur.
8.1. L'entité Véhicule
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
// on a besoin de conducteur car un véhicule est associé
// à un conducteur
use App\Entity\Conducteur;
use App\Repository\VehiculeRepository;
// for date
use Symfony\Component\Validator\Constraints
as Assert;
#[ORM\Entity(repositoryClass: VehiculeRepository::class)]
class Vehicule
{
// --------------------------------------------------------------
// Description des champs
// --------------------------------------------------------------
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $ve_id = null;
#[ORM\Column(type:'string', length:30)]
private ?string $ve_marque = null;
#[ORM\Column(type:'string', length:30)]
private ?string $ve_modele = null;
#[ORM\Column(type: "datetime", nullable: true)]
#[Assert\NotBlank]
#[Assert\NotNull]
private $ve_date;
// relation vers Conducteur : un véhicule possède un seul conducteur
#[ORM\ManyToOne(targetEntity : Conducteur::class, inversedBy: "vehicules")]
#[ORM\JoinColumn(nullable:false, name: 've_co_id', referencedColumnName: 'co_id')]
private Conducteur $ve_conducteur;
// --------------------------------------------------------------
// Methodes
// --------------------------------------------------------------
public function __construct()
{
$this->ve_date = new \DateTime();
}
function getVeId() {
return $this->ve_id;
}
function getVeMarque() {
return $this->ve_marque;
}
function setVeMarque($marque) {
$this->ve_marque = $marque;
return $this;
}
function getVeModele() {
return $this->ve_modele;
}
function setVeModele($modele) {
$this->ve_modele = $modele;
return $this;
}
public function getVeDate(): ?\DateTimeInterface
{
return $this->ve_date;
}
public function setVeDate(\DateTimeInterface $date): self
{
$this->ve_date = $date;
return $this;
}
public function getVeConducteur(): ?Conducteur
{
return $this->ve_conducteur;
}
public function setVeConducteur(?Conducteur $conducteur): self
{
$this->ve_conducteur = $conducteur;
return $this;
}
}
?>
8.2. Contrôleur pour l'entité Véhicule
On dispose du même type de route que pour le Conducteur :
- /vehicule/ajouter qui permet d'ajouter un nouveau véhicule
- /vehicule/modifier/{id} qui permet de modifier un véhicule en fonction de son identifiant
- /vehicule/supprimer/{id} qui permet de supprimer un véhicule en fonction de son identifiant
- /vehicule/supprimer_tout qui permet de supprimer tous les véhicules (debug/test)
- /vehicule/lister qui permet de retourner la liste de tous les véhicules
<?php
namespace App\Controller;
use App\Entity\Vehicule;
use App\Form\VehiculeType;
use App\Repository\VehiculeRepository;
use App\Repository\ConducteurRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
// Utilisation d'un logger pour le débogage
use Psr\
Log\LoggerInterface
;
class VehiculeController extends AbstractController
{
// Logger
private $logger;
private $entity_manager;
private $repository;
/**
* Constructeur auquel on passe en paramètre un logger
*/
public function __construct(LoggerInterface $logger, EntityManagerInterface $entity_manager)
{
$this->logger = $logger;
$this->entity_manager = $entity_manager;
// obtenir le Repository lié au véhicule depuis l'EntityManager
$this->repository = $entity_manager->getRepository(Vehicule::class);
}
}
8.3. Repository pour l'entité Véhicule
On donne deux fonctionalités au repository lié au véhicule :
- sauvegarder une entité dans le cas d'un ajout ou d'une modification
- obtenir la liste des véhicules stockés dans la base de données, classés par marque puis par modèle
<?php
namespace App\Repository;
use App\Entity\Vehicule;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<Vehicule>
*/
class VehiculeRepository extends ServiceEntityRepository
{
/**
* Constructeur
*/
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Vehicule::class);
}
/**
* Sauvegarde dans la base de donnée
*/
public function save(Vehicule $vehicule, bool $flush = false): void
{
$this->getEntityManager()->persist($vehicule);
if ($flush) {
$this->getEntityManager()->flush();
}
}
/**
* @return Vehicule[]
*
* Retourne un tableau de Vehicule classés suivant la marque ($ve_Marque)
* puis le modèle ($ve_modele)
*/
public function findAllOrdered()
{
$r = $this->createQueryBuilder('c')
->orderBy('c.ve_marque', 'ASC')
->addOrderBy('c.ve_modele', 'ASC')
->getQuery()
->getResult();
return $r;
}
}
?>
8.4. Lister les véhicules
Pour lister les véhicules il faut ajouter la fonction adéquate au niveau du contrôleur :
<?php
// ...
class VehiculeController extends AbstractController
{
#[Route('/vehicule/lister', name: 'vehicule_lister')]
public function lister(Request $request): Response
{
$liste_vehicules = $vehicule_repository->findAllOrdered();
return $this->render("vehicule/lister.html.twig", [
'liste_vehicules' => $liste_vehicules
]);
}
}
On réalise une énumération des véhicules (bloucle for) avec la variable e (pour élément)
et on affichera :
- l'identifiant du véhicule
- la marque du véhicule (ex: Volkswagen)
- le modèle du véhicule (ex: Tiguan)
- le conducteur associé au véhicule
- les boutons qui permettent de modifier ou supprimer le véhicule
<section>
<h2>Véhicules</h2>
<nav>
<ul>
<li><a href="/vehicule/creer">[+] Ajouter</a></li>
<li><a href="/vehicule/tout_supprimer">[x] Tout Supprimer</a></li>
</ul>
</nav>
<p>Aucun véhicule trouvé.</p>
<table>
<tr>
<th style="width: 50px">Id</th>
<th style="width: 150px">Marque</th>
<th style="width: 150px">Modèle</th>
<th style="width: 150px">Conducteur</th>
<th style="width: 50px">Suppr.</th>
<th style="width: 50px">Mod.</th>
</tr>
{%
for e in vehicules_list %
}
<tr>
<td class="center">{{ e.VeId }}</td>
<td> {{ e.VeMarque }}</td>
<td> {{ e.VeModele }}</td>
<td> {{ e.VeConducteur.CoNom }}</td>
<td class="center"><img src="{{ asset('images/delete.png') }}" alt="delete"
onclick="return vehicule_supprimer({{ e.VeId }}, '{{ e.VeMarque }}', '{{ e.VeModele }}');" /></td>
<td class="center"><img src="{{ asset('images/modify.png') }}" alt="modify"
onclick="return vehicule_modifier({{ e.VeId }}, '{{ e.VeMarque }}', '{{ e.VeModele }}');" /></td>
</tr>
</table>
</section>
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 :
<?php
// ...
class VehiculeController extends AbstractController
{
// ...
/**
* Supprimer un véhicule étant donné son id
*/
#[Route('/vehicule/supprimer/{id}', name: 'vehicule_supprimer')]
public function supprimer( $id ): Response
{
// Récupérer le vehicule par son id
$vehicule = $this->repository->find($id);
if (!$vehicule) {
throw $this->createNotFoundException('Aucun véhicule avec l\'identifiant ' . $id . ' n\'a été trouvé');
}
// Suppression du vehicule
$this->entity_manager->remove($vehicule);
$this->entity_manager->flush();
return $this->redirectToRoute('vehicule_lister');
}
/**
* Supprimer tous les véhicules (debug/test)
*/
#[Route('/vehicule/supprimer_tout', name: 'vehicule_supprimer_tout')]
public function supprimer_tout(): Response
{
// Récupérer les vehicules
$vehicules = $this->repository->findAll();
foreach($vehicules as $vehicule) {
$this->entity_manager->remove($vehicule);
}
$this->entity_manager->flush();
return $this->redirectToRoute('vehicule_lister');
}
// ...
}
?>
On notera que le véhicule est supprimé mais pas son conducteur.