Récupérer les erreurs d'un formulaire sous forme de tableau
Le système de validation d'une class avec Symfony est très performant. Quand nous validons un formulaire, les erreurs apparaitront automatiquement, sans presque aucune action de notre part. Cependant, si nous voulons récupérer cette liste d'erreurs sous forme d'un simple tableau, cela peut s'avérer vite compliqué si on ne s'y prend pas bien.Voyons l'exemple suivant qui traite une requête AJAX permettant de créer un utilisateur (à l'inscription d'un utilisateur par exemple) :
/**
* @Route("/user/creer", name="user_creer")
* @Method({"POST"})
*/
public function userCreerAction(Request $request)
{
// On créé l'entité $utilisateur avec les données fourni en POST
$utilisateur = new Utilisateur();
$utilisateur->setPrenom($request->request->get('prenom'));
$utilisateur->setNom($request->request->get('nom'));
// On récupère le validateur grâce au container de service
$validator = $this->get('validator');
// On récupère la liste des erreurs de notre entité $user
$liste_erreurs = $validator->validate($utilisateur);
// La méthode conseillé pour savoir si le validateur a levé des erreurs est d'utiliser la fonction count() sur $liste_erreurs comme on le ferait sur un tableau classique
if (count($liste_erreurs) > 0) {
// Si nous voulons retourné le tableau d'erreurs sous forme JSON, nous sommes tenté d'écrire :
return new JsonResponse($liste_erreurs); // Renvoi : {} dans tous les cas, même si l'entité contient des erreurs
// Essayons d'afficher classiquement cette liste d'erreurs
return new Response($liste_erreurs);
// Ceci nous renverra :
// Object(AppBundle\Entity\Utilisateur).prenom: "Le prénom est trop court" (code bf447c1c-0266-4e10-9c6c-573df282e413) Object(AppBundle\Entity\Utilisateur).nom: "Le nom de famille ne doit pas contenir de caractères spéciaux" (code de1e3db3-5ed4-4941-aae4-59f3667cc3a3)
}
else {
// Il n'y a pas d'erreur, on fait ce qu'on a à faire avec l'entité $utilisateur
// ...
}
}
L'explication est simple :
$validator->validate($utilisateur)
ne renvoi pas un tableau comme on pourrait le croire, mais un objet de type ConstraintViolationListInterface
qui implémente les interfaces Traversable
, Countable
, ArrayAccess
. C'est l'interface Countable
de cet objet qui permet d'utiliser la fonction count()
dessus de la même façon qu'on le ferait avec un tableau.Pour récupérer une liste d'erreur sous forme de tableau, il faut tout simplement le faire à la main, comme ceci :
$erreurs = array();
foreach ($liste_erreurs as $erreur) {
// On récupère le nom du champ sur lequel a été levé l'erreur
$champ = $erreur->getPropertyPath();
// On récupère le message d'erreur
$erreurs[$champ] = $erreur->getMessage();
}
Nous avons nos erreurs sous forme de tableau : return new JsonResponse($liste_erreurs);
// retournera maintenant :
// {"nom":"Le nom de famille ne doit pas contenir de caractères spéciaux","prenom":"Le prénom est trop court"}
Sources
- Recherche "symfony constraint validation to array"
- http://knplabs.com/fr/blog/symfony-validators-standalone
$validator->validate()
renvoi un objet de typeConstraintViolationListInterface
:- Recherche "symfony validator validate"
- http://api.symfony.com/master/Symfony/Component/Validator/Validator.html
- L'objet de type
ConstraintViolationListInterface
implémente l'interfaceCountable
: - http://api.symfony.com/master/Symfony/Component/Validator/ConstraintViolationListInterface.html
- Autres recherches :
- Recherche "symfony form get error"
- https://stackoverflow.com/questions/6978723/symfony2-how-to-get-form-validation-errors-after-binding-the-request-to-the-fo
- Recherche "symfony form get errors"
- https://symfony.com/doc/current/components/form.html#accessing-form-errors
- Recherche "symfony form get error to array"
- https://knpuniversity.com/blog/symfony-debugging-form-errors
- Recherche "symfony api form error"
- https://knpuniversity.com/screencast/symfony-rest2/validation-errors-response
- Recherche "symfony equivalent of form_errors"