Ce tutoriel explore deux approches pour la gestion de la forme dans Symfony 2. Le premier démontre des éléments de formulaire d'intégration directement dans la vue et les traitant manuellement dans le contrôleur. Le second utilise le système de formulaire de Symfony pour la déclaration de formulaire orientée objet et le traitement et la persistance automatisés.
Nous utiliserons ACMeMobundle par défaut de Symfony pour l'illustration. Le code complet est disponible dans [ce référentiel] (Repository_link_here - Remplacez par un lien réel si disponible).
Concepts clés:
Formes de non-entité:
Cet exemple démontre les formulaires de traitement défini comme HTML standard dans un fichier de vue Symfony. Le processus implique trois étapes:
form1.html.twig
Le fichier (situé dans src/Acme/DemoBundle/Resources/views/Welcome
) contient le HTML: {% extends "AcmeDemoBundle::layout.html.twig" %} {% block content %} <h1>Form values</h1> {% if name is defined %} <p>Name: {{ name }} </p> {% endif %} <form method="post" action="{{ path('_form1') }}"> <label for="name">Name:</label> <input type="text" id="name" name="name" /><br> <input type="submit" name="submit" value="Submit" /> </form> {% endblock %}
WelcomeController
comprend une méthode A form1Action
: use Symfony\Component\HttpFoundation\Request; // ... other code ... public function form1Action(Request $request) { $name = 'Not submitted yet'; if ($request->isMethod('POST') && $request->request->has('submit')) { $name = $request->request->get('name'); } return $this->render('AcmeDemoBundle:Welcome:form1.html.twig', ['name' => $name]); }
routing.yml
(dans src/Acme/DemoBundle/Resources/config
) comprend: _form1: path: /form1 defaults: { _controller: AcmeDemoBundle:Welcome:form1 }
Cela mappe /form1
à la méthode form1Action
.
Cette approche, bien que fonctionnelle, est moins adaptée aux formes complexes ou à la persistance des données.
Entités et formulaires Symfony:
Cette section illustre la création et le traitement d'un formulaire pour une entité Symfony (par exemple, Article
). Nous utiliserons cinq fichiers: le contrôleur, routing.yml
, deux fichiers de vue (form2.html.twig
, form2saved.html.twig
) et une classe de type de formulaire ArticleType.php
.
src/Acme/DemoBundle/Form
) {% extends "AcmeDemoBundle::layout.html.twig" %} {% block content %} <h1>Form values</h1> {% if name is defined %} <p>Name: {{ name }} </p> {% endif %} <form method="post" action="{{ path('_form1') }}"> <label for="name">Name:</label> <input type="text" id="name" name="name" /><br> <input type="submit" name="submit" value="Submit" /> </form> {% endblock %}
use Symfony\Component\HttpFoundation\Request; // ... other code ... public function form1Action(Request $request) { $name = 'Not submitted yet'; if ($request->isMethod('POST') && $request->request->has('submit')) { $name = $request->request->get('name'); } return $this->render('AcmeDemoBundle:Welcome:form1.html.twig', ['name' => $name]); }
_form1: path: /form1 defaults: { _controller: AcmeDemoBundle:Welcome:form1 }
<?php namespace Acme\DemoBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title', 'text', ['label' => 'Title']) ->add('body', 'textarea') ->add('save', 'submit') ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(['data_class' => 'Acme\DemoBundle\Entity\Article']); } public function getName() { return 'article'; } }
// ... other uses ... use Acme\DemoBundle\Entity\Article; use Acme\DemoBundle\Form\ArticleType; // ... other methods ... public function form2Action(Request $request) { $article = new Article(); $form = $this->createForm(ArticleType::class, $article); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($article); $em->flush(); $this->addFlash('message', 'Article saved!'); return $this->redirectToRoute('_form2saved'); } return $this->render('AcmeDemoBundle:Welcome:form2.html.twig', ['form' => $form->createView()]); } public function form2savedAction() { return $this->render('AcmeDemoBundle:Welcome:form2saved.html.twig'); }
Cette approche exploite les fonctionnalités de Symfony pour une solution plus robuste et maintenable. Choisissez la méthode la mieux adaptée à la complexité de votre formulaire et aux besoins de gestion des données. Pour les formes complexes ou les interactions de base de données, l'approche entité / formulaire est fortement recommandée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!