Formulaire Symfony : créer, traiter et afficher un formulaire
Un formulaire Symfony se décrit dans une classe de type liée à un objet ; le composant Form gère le HTML, la lecture de la requête et le jeton CSRF.
#[Route('/cuisine/nouveau-plat', name: 'app_nouveau_plat', methods: ['GET', 'POST'])] public function nouveauPlat(Request $request, EntityManagerInterface $entityManager, SluggerInterface $slugger): Response { $plat = new Plat(); $form = $this->createForm(PlatType::class, $plat); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $plat->setSlug($slugger->slug($plat->getNom())->lower()->toString()); $entityManager->persist($plat); $entityManager->flush(); return $this->redirectToRoute('app_plat', ['slug' => $plat->getSlug()]); } return $this->render('cuisine/nouveau.html.twig', ['form' => $form]); }
La classe de type, un AbstractType avec buildForm() et data_class, déclare les champs : TextType, IntegerType, ou EntityType avec choice_label pour choisir une catégorie en base. handleRequest() remplit l'objet, isSubmitted() et isValid() décident de la suite, et Twig affiche le tout avec form_start(), form_widget() et form_end(). Réaffiché après un envoi invalide, le formulaire part avec un statut 422. Symfony 8.2 ajoute BoundsType pour une période et #[AsFormType] pour décrire les champs sur un DTO. Le piège : oublier handleRequest(). isSubmitted() reste faux, et le formulaire se réaffiche sans rien enregistrer ni signaler.
Les exercices font remplacer un formulaire écrit à la main par un PlatType, ajouter le formulaire d'avis du livre d'or, lever la malédiction d'un formulaire qui ne fait plus rien, programmer des soirées de contes et y inscrire des voyageurs sans dépasser les places, puis découvrir BoundsType et la description d'un formulaire par attributs.
7 exercices font travailler cette notion, en écrivant du code dans le navigateur.
Dans les parcours
- Un formulaire digne de ce nom Symfony pour les devs PHP · chapitre 3 : Les parchemins de la taverne
- Le livre d'or Symfony pour les devs PHP · chapitre 3 : Les parchemins de la taverne
- 🐉 Boss : le parchemin maudit Symfony pour les devs PHP · chapitre 3 : Les parchemins de la taverne
- L'affiche des soirées Symfony pour les devs PHP · chapitre 12 : Le grand service
- Les inscriptions Symfony pour les devs PHP · chapitre 12 : Le grand service
Dans la Pratique
- Un champ pour une période, avec BoundsType Deux dates et la règle qui les ordonne tiennent dans un seul champ : plus d'écouteur POST_SUBMIT pour comparer les bornes à la main.
- Décrire un formulaire par attributs Les champs d'un formulaire se déclarent sur le DTO, juste à côté des contraintes de validation : plus de classe de formulaire pour les cas simples.