7. Ajouter, Supprimer, Modifier un Conducteur
7.1. Supprimer
Pour supprimer un conducteur il faut ajouter la fonction adéquate au niveau du contrôleur :
<?php
// ...
class ConducteurController {
//...
/**
* Supprimer un conducteur étant donné son id
*/
#[Route('/conducteur/supprimer/{id}', name: 'conducteur_supprimer')]
public function supprimer( $id ): Response
{
// à partir du Repository, obtenir le conducteur grâce à son identifiant
$conducteur = $this->repository->find($id);
// dans le cas où le conducteur n'aurait pas été trouvé, générer une exception
if (!$conducteur) {
throw $this->createNotFoundException('Acucun conducteur d\'identifiant ' . $id . ' n\'a été trouvé');
}
// Suppression du conducteur
$this->entity_manager->remove($conducteur);
$this->entity_manager->flush();
// se rediriger vers l'affichage de la liste des conducteurs
// Attention on utilise le nom de la route 'conducteur_lister'
// et non 'conducteur/lister'
return $this->redirectToRoute('conducteur_lister');
}
}
?>
7.2. Ajouter
L'ajout d'un conducteur n'est pas chose aisée car il faut gérer les erreurs éventuelles. On utilise
pour cela une variable locale à la fonction appelée \$message_erreur.
On commence par créer une instance de la classe Conducteur puis on génère un
formulaire dont les champs seront remplis par l'instance créée.
<?php
// ...
use App\Form\ConducteurType;
class ConducteurController {
//...
/**
* Créer un nouveau conducteur en affichant un formulaire
* de saisie des informations
*/
#[Route('/conducteur/ajouter', name: 'conducteur_creer')]
public function ajouter(Request $request): Response
{
$this->logger->info( 'Ajouter un conducteur' );
$message_erreur = "";
// créer un conducteur dont les champs sont vides
$conducteur = new Conducteur();
// créer un formulaire qui prend en compte les données du conducteur
$form = $this->createForm(ConducteurType::class, $conducteur);
// récupération des données de la requête, notamment des
// informations liées à la saisie d'un conducteur
$form->handleRequest($request);
// Si on vient de soumettre le formulaire et que les données
// sont valides
if ($form->isSubmitted() && $form->isValid()) {
// Check if a driver with the same name already exists
$conducteur_existant = $this->repository->findOneBy(['co_nom' => $conducteur->getCoNom()]);
if ($conducteur_existant) {
$message_erreur = 'Il existe déjà un conducteur de même nom';
} else {
// alors sauvegarder le conducteur (persist, flush)
$this->repository->save($conducteur, true);
// se rediriger vers l'affichage de la liste des conducteurs
// Attnetion on utilise le nom de la route 'conducteur_lister'
// et non 'conducteur/lister'
return $this->redirectToRoute('conducteur_lister');
}
}
// sinon afficher la page contenant le formulaire d'ajout
if (!empty($message_erreur)) $this->addFlash('error', $message_erreur);
return $this->render('conducteur/ajouter.html.twig', [
'form' => $form->createView(),
'message_erreur' => $message_erreur
]);
}
}
?>
Le formulaire lié à la création d'un conducteur doit être créé dans le sous-répertoire src/Form.
On crée alors le fichier src/Form/ConducteurType.php
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
// inclure la classe Conducteur
use App\Entity\Conducteur;
class ConducteurType extends AbstractType
{
/**
* Création d'un formulaire de saisie
*/
public function buildForm
(FormBuilderInterface
$builder, array $options)
{
// le conducteur ne contient qu'un champ nom de type string
$builder
->add('co_nom', TextType::class, [
'label' => 'Nom',
'required' => true,
]);
// ajout d'un gestionnaire d'évènement afin de modifier le nom du conducteur
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
// Si le nom existe alors mettre la première lettre en majuscule
// et les autres lettres en minuscules
if (isset($data['co_nom'])) {
}
// modifier l'évènement avec les nouvelles données
$event->setData($data);
});
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Conducteur::class
]);
}
}
?>
La fonction buildForm permet de créer les champs du formulaire.
On peut également ajouter un gestionnaire d'évènement (méthode addEventListener) dont le but est de modifier les
champs une fois saisis. Ici, par exemple, on modifie le nom du conducteur afin que les noms aient tous
le même format : première lettre en majuscule, les lettres suivantes en minuscules.
7.3. Modifier
La modification fonctionne sur le même modèle que l'ajout avec comme différence le chargement des données
du conducteur avant affichage du formulaire de saisie.
<?php
// ...
use App\Form\ConducteurType;
class ConducteurController {
//...
/**
* Modifier un conducteur étant donné son id
*/
#[Route('/conducteur/modifier/{id}', name: 'conducteur_modifier')]
public function modifier(Request $request, EntityManagerInterface $entityManager, int $id): Response
{
// à partir du Repository, obtenir le conducteur grâce à son identifiant
$conducteur = $this->repository->find($id);
// dans le cas où le conducteur n'aurait pas été trouvé, générer une exception
if (!$conducteur) {
throw $this->createNotFoundException('Acucun conducteur d\'identifiant ' . $id . ' n\'a été trouvé');
}
// créer le formulaire lié au conducteur
$form = $this->createForm(ConducteurType::class, $conducteur);
// récupération des données de la requête, notamment des
// informations liées à la saisie d'un conducteur
$form->handleRequest($request);
// Si on vient de soumettre le formulaire et que les données
// sont valies
if ($form->isSubmitted() && $form->isValid()) {
// alors sauvegarder le conducteur (persist, flush)
$this->repository->save($conducteur, true);
// se rediriger vers l'affichage de la liste des conducteurs
// Attnetion on utilise le nom de la route 'conducteur_lister'
// et non 'conducteur/lister'
return $this->redirectToRoute('conducteur_lister');
}
// sinon afficher la page contenant le formulaire de modification
return $this->render('conducteur/modifier.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
La page TWIG concernant la modification est la suivante :
{# templates/conducteur/new.html.twig #}
<section>
<h2>Modification d'un conducteur</h2>
{{ form_start(form) }}
{{ form_row(form.co_nom) }}
<button type="submit">Mettre à jour</button>
{{ form_end(form) }}