Symfony

RÉCUPÉRER LES ERREURS D'UN FORMULAIRE SOUS FORME DE TABLEAU

D

Jeudi 21 décembre 2017

Mis à jour le vendredi 19 janvier 2018

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"}

Une erreur ? une question ? une critique ? une faute ? un conseil ? ou tout simplement un merci ?

Lâche ton commentaire