Pour une entité nommée MonEntite dans un bundle nommé ML/MonBundle :
bin/console doctrine:generate:form MLMonBundle:MonEntite
Cette commande crée une classe MonEntiteType définie dans le fichier src/ML/MonBundle/Form/MonEntiteType.php
Il est conseillé d'ajouter les types et les options à chaque champ de formulaire ajouté dans cette classe, ainsi que retirer les champs en trop et ajouter les champs manquants (bouton submit, …).
Pour créer un formulaire à partir de cette classe dans le code d'un formulaire:
namespace ML\MonBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use ML\MonBundle\Entity\MonEntite; use ML\MonBundle\Form\MonEntiteType; class MonController extends Controller { public function addAction(Request $request) { $monEntite = new MonEntite; $form = $this->get('form.factory') ->create(MonEntiteType::class, $monEntite); if($request->isMethod('POST') && $form->handleRequest($request)->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($advert); $em->flush(); $request->getSession()->getFlashBag()->add('notice', 'Données enregistrées.'); return $this->redirectToRoute('ml_monbundle_view', ['id' => $monEntite->getId()]); } return $this->render('MLMonBundle:MonController:add.html.twig', [ 'form' => $form->createView(), ]); } }
La ligne de création du formulaire (avec 'form.factory') peut être raccourcie :
$form = $this->createForm(MonEntiteType::class, $monEntite);
Exemple dans avec une classe Personne :
use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use MonBundle\MesClasses\Personne; public function indexAction() { $personne = new Personne(); $formBuilder = $this->get('form.factory') ->createBuilder(FormType::class, $personne); $formBuilder ->add('nom', TextType::class) ->add('prenom', TextType::class) ->add('enregistrer', SubmitType::class); $form = $formBuilder->getForm(); return $this->render('MonBundle:Personnes:index.html.twig', [ 'form' => $form->createView(), ]); }
Lors de l'appel de $this→render dans le contrôleur, on passe le formulaire sous forme de variable nommée 'form'. C'est sous ce nom que l'on va y faire référence dans le template.
Sous sa forme la plus simple, le formulaire est rendu de cette façon :
{{ form(form) }}
Mais on ne contrôle absolument pas la façon dont l'affichage est fait. Pour maîtriser comment chaque partie du formulaire sera rendue, il faut l'éclater en ses différentes parties dans notre template. Par exemple, en utilisation la librairie CSS Bootstrap:
<div class="well"> {{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }} {{ form_errors(form) }} <div class="form-group"> {{ form_errors(form.nom) }} <div class="col-sm-8"> {{ form_widget(form.nom, {'attr': {'class': 'form-control'}}) }} </div> </div> <div class="form-group"> <div class="col-sm-8"> {{ form_widget(form.enregistrer, {'attr': {'class': 'btn btn-primary'}}) }} </div> </div> {{ form_rest(form) }} {{ form_end(form) }} </div>
Dans app/config/config.yml il faut ajouter une ligne dans la section twig :
# Twig Configuration twig: ... form_themes: - 'bootstrap_3_layout.html.twig'
Le template bootstrap_3_layout.html.twig est inclus dans Symfony et définit le rendu d'un formulaire adapté à la librairie CSS Bootstrap 3.