Cette fonction récupère toutes les erreurs. Celles du formulaire comme « Le jeton CSRF n’est pas valide. Please try to resubmit the form » ainsi que les erreurs complémentaires sur les formulaires fils qui n’ont pas error_bubbling.
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
foreach ($form->getErrors() as $key => $error) {
if ($form->isRoot()) {
$errors['#'][] = $error->getMessage();
} else {
$errors[] = $error->getMessage();
}
}
foreach ($form->all() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
return $errors;
}
Pour obtenir toutes les erreurs sous forme de chaîne de caractères :
Voici la solution qui a fonctionné pour moi. Cette fonction se trouve dans un contrôleur et renvoie un tableau structuré de tous les messages d’erreur et du champ qui les a provoqués.
Symfony 2.0:
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach($parameters as $var => $value){
$template = str_replace($var, $value, $template);
}
$errors[$key] = $template;
}
if ($form->hasChildren()) {
foreach ($form->getChildren() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
}
return $errors;
}
Symfony 2.1 et plus:
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
if ($form->hasChildren()) {
foreach ($form->getChildren() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
} else {
foreach ($form->getErrors() as $key => $error) {
$errors[] = $error->getMessage();
}
}
return $errors;
}
Utilisez le validateur pour récupérer les erreurs d’une entité spécifique :
if( $form->isValid() )
{
// ...
}
else
{
// récupérer la liste des violations de contraintes
$errors = $this->get('validator')->validate( $user );
$result = '';
// parcourir le tableau $errors
foreach( $errors as $error )
{
// Faire des actions avec :
// $error->getPropertyPath() : le champ qui a provoqué l'erreur
// $error->getMessage() : le message d'erreur
}
}
public function getErrorMessages(Form $form) {
$errors = [];
foreach ($form->all() as $child) {
foreach ($child->getErrors() as $error) {
$name = $child->getName();
$errors[$name] = $error->getMessage();
}
}
return $errors;
}
J’ai obtenu cette sorte de JSON :
errors: {
firstname: "The firstname must be between 2 and 30 characters long.",
lastname: "The lastname must be between 2 and 40 characters long."
subject: "Please choose a subject."
text: "Empty messages are not allowed."
}