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

Dans la Pratique

Notions voisines

CSRFRelationsDébogageSécuritéRequêtes N+1TemplatedEmailDTO