Le composant de validation de Symfony est conçu pour vérifier la conformité des données. Il peut être utilisé indépendamment ou avec des formulaires. Voici une vue détaillée de son fonctionnement et de ses possibilités.
Objectifs de la Validation
- Validation côté serveur : Assurez-vous que les données respectent des critères définis.
- Complément au HTML5 : Les attributs tels que
required
offrent une validation côté client, mais seule la validation serveur est fiable. - Exemples courants :
- Vérifier qu’un champ n’est pas vide.
- Valider une adresse e-mail ou un numéro de téléphone.
- Vérifier la longueur ou le format des données.
Définir des Contraintes de Validation
Les contraintes définissent les règles que doivent respecter les données. Elles peuvent être configurées de deux manières :
- Au niveau de l’objet du modèle : Les règles sont associées directement aux propriétés de l’objet (souvent une entité Doctrine).
- Au niveau du formulaire : Les règles sont définies lors de la création du formulaire, via l’option
constraints
.
a. Contraintes sur les Champs du Formulaire
Les contraintes sont ajoutées à l’aide de l’option constraints
pour chaque champ :
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
$form = $this->createFormBuilder()
->add('email', EmailType::class, [
'constraints' => [
new NotBlank(['message' => 'L\'email est obligatoire.']),
new Email(['message' => 'Veuillez entrer une adresse email valide.']),
],
])
->add('message', TextareaType::class, [
'constraints' => new NotBlank(),
])
->getForm();
Avantages :
- Les règles sont définies directement là où les champs sont configurés.
- Plus simple à maintenir pour les formulaires uniques.
b. Contraintes sur l’Objet Associé
Les contraintes peuvent être directement associées aux propriétés d’un objet (comme une entité Doctrine) :
use Symfony\Component\Validator\Constraints as Assert;
class Message
{
#[Assert\NotBlank(message: 'L\'email est obligatoire.')]
#[Assert\Email(message: 'Veuillez entrer une adresse email valide.')]
private $email;
#[Assert\NotBlank()]
private $message;
// Getters et Setters...
}
Dans le contrôleur, le formulaire utilise l’objet pour appliquer ses règles :
$form = $this->createFormBuilder($message)
->add('email', EmailType::class)
->add('message', TextareaType::class)
->getForm();
Avantages :
- Les règles sont réutilisables dans plusieurs formulaires ou contextes (API, services, etc.).
- Séparation claire entre la logique métier et la logique du formulaire.
Formats de Configuration des Contraintes
Les contraintes peuvent être définies dans différents formats : attributs, annotations, YAML, XML ou PHP.
Attributs :
use Symfony\Component\Validator\Constraints as Assert;
class Message
{
#[Assert\NotBlank]
#[Assert\Email]
private $email;
}
YAML :
App\Entity\Message:
properties:
email:
- NotBlank: ~
- Email: ~
XML :
<constraint-mapping>
<class name="App\Entity\Message">
<property name="email">
<constraint name="NotBlank" />
<constraint name="Email" />
</property>
</class>
</constraint-mapping>
PHP :
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('email', new Assert\NotBlank());
$metadata->addPropertyConstraint('email', new Assert\Email());
}
Options des Contraintes
Chaque contrainte peut avoir des options pour ajuster son comportement.
- Exemple : Contrainte Length :
#[Assert\Length(min: 5, max: 100, minMessage: 'Trop court.', maxMessage: 'Trop long.')]
private $message;
- Exemple : Contrainte Regex :
#[Assert\Regex(pattern: '/^0[6|7][0-9]{8}$/', message: 'Numéro invalide.')]
private $telephone;
Groupes de Validation
Les groupes de validation permettent d’appliquer différentes règles selon le contexte (inscription, modification, etc.).
- Définir des groupes :
#[Assert\NotBlank(groups: ['Inscription'])]
private $password;
- Utiliser les groupes dans un formulaire :
$form = $this->createFormBuilder($user, [
'validation_groups' => ['Inscription'],
])->getForm();
Validation Hors Formulaire
Le composant Validator peut être utilisé en dehors des formulaires, par exemple dans des services ou des API.
Exemple : Validation d’un Objet :
use Symfony\Component\Validator\Validator\ValidatorInterface;
public function validateData(ValidatorInterface $validator, Message $message)
{
$errors = $validator->validate($message);
if (count($errors) > 0) {
foreach ($errors as $error) {
echo $error->getMessage(); // Affiche les erreurs
}
} else {
echo "Les données sont valides.";
}
}
- NotBlank : La valeur ne doit pas être vide.
- Length : Contrôle la longueur d’une chaîne.
- Email : Valide une adresse e-mail.
- Regex : Vérifie une correspondance avec une expression régulière.
- UniqueEntity : Assure l’unicité d’une propriété (entité Doctrine).
- Choice : Restreint les valeurs possibles à une liste.
La validation des données avec Symfony offre une grande flexibilité et s’intègre harmonieusement avec les formulaires, les objets Doctrine, et les services. En choisissant judicieusement entre validation au niveau des formulaires ou des objets, vous pouvez maintenir un code clair, réutilisable et sécurisé.