Académique Documents
Professionnel Documents
Culture Documents
Accueil > Cours > Construisez un site web à l’aide du framework Symfony 5 > Interagissez avec vos utilisateurs
20 heures Moyenne
Mis à jour le 08/07/2022
Imaginons un formulaire de création d'articles pour un blog. Au plus simple, pour un article, nous souhaitons un titre, un contenu principal, un nom d'au
sous forme d'objet :
<?php
// src/Entity/Article.php
namespace App\Entity;
class Article
{
private $author;
private $content;
private $title;
// ...
}
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 1/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Cet objet n'est pas lié à Symfony, il correspond à votre besoin métier.
Comment créer un formulaire, alors ? Il va falloir créer un "type de formulaire" à partir de notre objet.
Création du formulaire
Un type de formulaire est une classe qui permet de construire un formulaire en définissant les différents types de champs. Voici un exemple valide de ty
précédent :
<?php
// src/Form/ArticleType.php
namespace App\Form;
use App\Entity\Article;
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\Extension\Core\Type\TextareaType;
La création d'un formulaire à partir d'un objet est plutôt simple pour deux raisons principales :
1. le composant Form dispose d'un constructeur de formulaires (le form builder) capable de générer tout type de formulaire à partir de champs qu'il
texte, de type date...) ;
2. en passant la classe au résolveur d'options du formulaire, le constructeur de formulaires est capable - à partir de la classe - de deviner quel type de
exemple, si une classe a une propriété de type DateTime, alors le champ utilisé sera de type datetime en HTML.
Par défaut, le type de champ rendu sera un champ "texte" qui correspond à la classe TextType, mais on peut évidemment définir pour chaque propriété
souhaite.
Par « type de champ », il ne faut pas comprendre « type HTML » comme text , password ou select, mais comprendre « type sémantique ». Par exem
aussi afficher trois champs HTML select à la suite pour choisir le jour, le mois et l'année. Il existe aussi un type TimezoneType pour choisir le fuseau
mal et ils n'ont rien à voir avec les types HTML ; ils vont bien plus loin que ces derniers !
Voici la liste des types de formulaires disponibles, assurez-vous de choisir un type de champ cohérent avec la propriété de l'objet correspondant :
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 2/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
SearchType TimezoneType
UrlType
CurrencyType
TelType
RangeType
ColorType
Chacun de ces types de formulaires possède de nombreuses options qui permettent encore de configurer l'affichage. Par exemple, chaque type de cha
qui permet d'afficher un message d'aide lié au champ de formulaire (ce qui est une bonne pratique).
<?php
$builder->add('title', null, [
'help' => "Le titre de l'article, utilisé dans l'url",
]);
<?php
// src/Controller/FormController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\ArticleType;
use App\Entity\Article;
{# templates/default/new.html.twig #}
{{ form(form) }}
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 3/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Ce n'est pas très joli, mais c'est fonctionnel ! Et nous améliorerons cela très bientôt.
Dans le gabarit Twig, nous allons adapter le rendu du formulaire et ajouter un bouton. Nous reviendrons sur les fonctions utilisées un peu plus tard :
{# templates/default/new.html.twig #}
<html>
<head></head>
<body>
{{ form_start(form) }}
{{ form_row(form.title) }}
{{ form_row(form.content) }}
{{ form_row(form.author) }}
Et mettons à jour notre contrôleur Symfony afin de récupérer les données reçues de la requête, et spécifiquement à partir du formulaire soumis :
<?php
// src/Controller/FormController.php
/**
* @Route("/form/new")
*/
public function new(Request $request)
{
$article = new Article();
$article->setTitle('Hello World');
$article->setContent('Un très court article.');
$article->setAuthor('Zozor');
$form->handleRequest($request);
Tout d'abord, nous mettons à jour le formulaire à l'aide des informations reçues de l'utilisateur : c'est le rôle de la fonction handleRequest().
Ensuite, nous vérifions que le formulaire a bien été soumis ($form->isSubmitted()) et qu'il est valide ($form->isValid()).
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 4/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Enfin, nous pouvons manipuler notre article mis à jour avec les données du formulaire. En utilisant le WebProfiler, on accède aux données provenant du
Pour l'instant, concentrons-nous sur quelque chose de vraiment important concernant les formulaires : la validation des données et l'envoi d'erreurs à
Vous aurez remarqué, dans le contrôleur précédemment mis à jour, que nous avons utilisé la fonction isValid() associée au formulaire.
Eh bien, dès lors que des règles de validation ont été définies, les formulaires sont capables d'utiliser le validateur automatiquement ! Dans notre cas, no
de règles de validation, alors notre formulaire est forcément valide.
La meilleure façon de définir un ensemble de règles à valider par le formulaire est d'utiliser les annotations fournies par le composant Validator au nivea
<?php
// src/Entity/Article.php
namespace App\Entity;
class Article
{
/**
* @Assert\Length(
* min = 10,
* max = 70,
* minMessage = "Ce titre est trop court",
* maxMessage = "Ce titre est trop long"
* )
*/
private $title;
/**
* @Assert\NotBlank(message = "Le contenu ne peut être vide.")
*/
private $content;
/**
* @Assert\NotBlank(message = "Un auteur doit être associé à l'article")
*/
private $author;
/* ... */
}
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 5/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
La validation - comme pour la gestion de nos URL - se déclare à l'aide d'annotations, en associant des contraintes de validation à des propriétés ou des m
objets.
Toutes les contraintes de validation ont une propriété message qui permet de redéfinir le message d'erreur qui sera retourné. Avant d'aller plus en détai
de validation à votre disposition, regardons comment fonctionne le validateur de Symfony.
Le validateur en bref
Le composant Validator de Symfony permet de créer un validateur :
<?php
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use App\Entity\Article;
if (0 !== count($violations)) {
// Affiche les erreurs
foreach ($violations as $violation) {
echo $violation->getMessage().'<br>';
}
}
Tout d'abord, la classe Validation du composant permet de créer une instance du validateur. Ce validateur a une méthode validate qui prend 2 argumen
Le résultat de cette fonction est une liste de violations qui permettent d'accéder aux messages d'erreurs correspondant aux contraintes qui n'ont pas été
valide, alors la liste de violations est vide.
Lorsque nous soumettons notre formulaire et que nous appelons la fonction isValid du formulaire Symfony, les contraintes de validation déclarées dans
appliquées sur l'objet $article qui a été retrouvé à partir des données de la requête utilisateur.
Type
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 6/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Count Currency All
Locale Isbn
Country Issn
Par défaut et en fonction des règles de validation configurées, le formulaire va appliquer certaines règles de validation HTML5 ; par exemple, voici le HTM
"Title" :
<input
type="text"
id="article_title"
name="article[title]"
maxlength="70"
pattern=".{10,}"
class="form-control"
value="Hello World"
>
La bonne nouvelle est que le serveur n'est pas appelé en cas d'erreur utilisateur ; la mauvaise est que, puisque le serveur n'est pas appelé, les messages q
pas accessibles...
Si la gestion des messages d'erreur est importante pour vous, une solution est de désactiver la validation HTML5 avec l'attribut "novalidate". Mettons à jo
<html>
<head></head>
<body>
{{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
{{ form_row(form.title) }}
{{ form_row(form.content) }}
{{ form_row(form.author) }}
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 7/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Ce n'est vraiment pas joli, mais fonctionnel ! Maintenant que nous avons une gestion de formulaires complète, occupons-nous de rendre cela un minim
form_start rend la balise <form> : on peut définir l'action, l'attribut method et ajouter différents attributs à la balise ;
form_row rend un champ de formulaire complet, label et messages d'erreurs compris ;
form_label rend le label ;
form_widget rend l'input ;
form_errors rend le bloc d'erreurs ;
form_rest rend tous les champs non encore rendus ;
csrf_token rend un input hidden avec une clé contre les attaques de type CSRF ;
form_end rend la balise fermante </form> .
Avec l'ensemble de ces fonctions, nous pouvons construire n'importe type de formulaire qui sera rendu en fonction du thème actif.
...
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 8/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Pour chaque type de formulaire livré avec Symfony, un thème de formulaire définit comment il doit être rendu en Twig. Ce n'est pas tout ! Par défaut, vo
4 plusieurs thèmes :
Bootstrap 3 ;
Bootstrap 4 ;
et Foundation 5.
Commençons par activer le thème de formulaire pour Bootstrap 4 et par ajouter le fichier CSS correspondant.
D'abord, il va falloir mettre à jour la configuration du framework pour activer le thème Bootstrap 4 :
# config/packages/twig.yaml
twig:
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
form_themes: ['bootstrap_4_layout.html.twig'] # accepte plusieurs thèmes
Maintenant que le thème est activé, mettons le gabarit du formulaire à jour en ajoutant Bootstrap 4 :
{# /templates/form/new_article.html.twig #}
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
{{ form_start(articleForm, {
'attr': {
'novalidate': 'novalidate',
'class': 'col-lg-5'
}
})
}}
{{ form_row(articleForm.title) }}
{{ form_row(articleForm.content) }}
{{ form_row(articleForm.author) }}
{{ form_row(articleForm.publicationDate) }}
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utilis… 9/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
Vous l'aurez compris : une fois votre thème de formulaire parfaitement adapté à votre besoin activé, l'intégration de vos formulaires sera rapide et homo
application !
Imaginons le formulaire d'un produit qui a 2 champs : prix et nom. Nous voulons, pour le prix, afficher un message d'information complémentaire à côté
{% block _product_price_widget %}
<div class="price_widget">
{{ block('form_widget_money') }}
<i>Des frais de transaction seront ajoutés.</i>
</div>
{% endblock %}
{{ form_widget(productForm.price) }}
Pour définir l'exact nom du fragment, il faut prendre le nom du formulaire (par exemple, pour la classe "ProductType" , c'est "product" , qui peut être redé
méthode getName() du type de formulaire) suivi du nom du champ, ici le champ "price".
On peut aussi le retrouver à partir de l'attribut "name" du champ HTML généré, qui vaudra product[price], ici.
Encore plus loin, intégrer un formulaire qui génère une collection de formulaires
La customisation d'un formulaire qui permet de créer une liste de sous-formulaires peut être difficile à appréhender. Imaginons un produit de type "Cha
associer différentes pointures.
Nous aurions donc un objet "Chaussure" qui aurait une propriété "pointures" qui serait une collection d'objets de type "Pointure", eux-mêmes n'ayant qu
<?php
namespace App\Form\Type;
use App\Model\Shoe;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utili… 10/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Shoe::class,
]);
}
}
{{ form_start(shoe) }}
{{ form_row(shoe.name) }}
<h3>Sizes</h3>
<ul class="sizes">
{% for size in shoe.sizes %}
<li>{{ form_row(size.value) }}</li>
{% endfor %}
</ul>
{{ form_end(form) }}
Si le formulaire a été configuré pour l'ajout de nouvelles pointures, alors le formulaire recevra une variable "prototype" avec le formulaire correspondant.
JavaScript pour construire de nouveaux formulaires.
Par exemple :
Vous pourrez trouver un exemple de code fonctionnel sur jsfiddle.net ou encore dans la documentation officielle. D'ailleurs, le prochain chapitre de ce co
d'expérimenter ce cas d'utilisation !
Console de code
Mettez immédiatement en application ce que vous avez
appris.
Vous êtes libre de vous tromper et de réessayer autant que vous
le souhaitez.
JE CODE MAINTENANT !
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utili… 11/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
En résumé
Le composant Form est responsable de la gestion des formulaires. À partir de vos objets métiers, vous pouvez construire vos formulaires qui seront utilis
dans vos vues.
Pour créer un formulaire, il vous faudra créer un type de formulaire qui sera automatiquement reconnu par le framework. Le composant fournit de très n
formulaires nativement, tous documentés et configurables selon vos besoins.
La validation des formulaires est automatique côté navigateur grâce aux attributs HTML5, la validation côté serveur se fait à l'aide du composant Validato
annotations sur les objets métiers directement.
Enfin, la customisation des formulaires se fait à l'aide de thèmes de formulaires. Le framework Symfony en fournit pour les principaux frameworks CSS, e
le gabarit de chaque type de formulaire, même pour un champ de formulaire spécifique.
Dans le prochain chapitre, nous introduirons une nouvelle brique importante pour nos applications : l'ORM Doctrine pour la persistance de données !
DYNAMISEZ VOS VUES À L’AIDE DE TWIG GÉREZ VOS DONNÉES AVEC DOCTR
Le professeur
Mickaël Andrieu
Consultant et Formateur Web / Data
OPENCLASSROOMS
OPPORTUNITÉS
AIDE
EN PLUS
Français
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utili… 12/13
18/07/2022 07:15 Interagissez avec vos utilisateurs - Construisez un site web à l’aide du framework Symfony 5 - OpenClassrooms
https://openclassrooms.com/fr/courses/5489656-construisez-un-site-web-a-l-aide-du-framework-symfony-5/5517026-interagissez-avec-vos-utili… 13/13