Symfony2 : Comment obtenir le formulaire de validation des erreurs, après liaison de la demande pour la forme
Voici mon saveAction
code (où le formulaire transmet les données à l')
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
Ma question est: comment puis-je obtenir les erreurs, si $form->isValid()
retourne false
?
Vous devez vous connecter pour publier un commentaire.
Vous avez deux façons de le faire:
{{ form_errors(form) }}
au sein de fichier de modèle$form->getErrors()
error_bubbling
à true dans votre formulaire en définissant explicitement la possibilité pour chaque champ.$form->getErrors(true)
pour inclure les erreurs de l'enfant, les formes ainsierror_bubbling
àtrue
pour chacun de mes domaines, à la fois{{ form_errors(form) }}
,$form->getErrors(true)
et$form->getErrorsAsString()
renvoie rien (tableau vide ou chaîne de caractères).Symfony 2.3 /2.4:
Cette fonction get de toutes les erreurs. Sur la forme comme "Le jeton CSRF est invalide. S'il vous plaît essayer de soumettre à nouveau le formulaire." ainsi que d'autres erreurs sur le formulaire d'enfants qui n'ont pas d'erreur de bulles.
Pour obtenir toutes les erreurs comme une chaîne de caractères:
Symfony 2.5 /3.0:
Docs:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form
https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (en bas:
The method Form::getErrorsAsString() was removed
)$errors[$child->getName()] = $this->getErrorMessages($child);
jetait exception, comme getErrorMessages est manquant à partir de Symfony\Bundle\FrameworkBundle\Controller\Controller composant. Donc je l'ai remplacé avec$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
et j'ai pensé que son appelé directement à l'intérieur d'un contrôleur et d'une partie de Symfony api.Ci-dessous est la solution qui a fonctionné pour moi. Cette fonction est dans un contrôleur et retournera un tableau structuré de tous les messages d'erreur et le champ qui les ont provoquées.
Symfony 2.0:
Symfony 2.1 et plus récente:
$this->getFormErrors
devrait être$this->getErrorMessages
dans votre échantillon dans Symfony2.1Utiliser le Validateur pour obtenir les erreurs pour une entité spécifique
De référence de l'API:
Pour obtenir bon (traduisible) messages, actuellement à l'aide de SF 2.6.3, voici ma dernière fonction (comme aucun des ci-dessus semblent plus travailler):
que la Forme::méthode getErrors() renvoie une instance de FormErrorIterator, sauf si vous passez le deuxième argument ($aplatir) à vrai. (Il sera ensuite de retour à un FormError exemple, et vous devrez appeler la méthode getMessage() directement, sans les() méthode:
)
La chose la plus importante est en fait de définir le premier argument à true afin d'obtenir les erreurs.
Laissant le second argument ($aplatir) à sa valeur par défaut (vrai) sera de retour FormError cas, tandis qu'il sera de retour FormErrorIterator cas lorsque la valeur est false.
La fonction de symfony 2.1 et plus récente, sans obsolète fonction:
IF
déclaration? Pourquoi est-ce mutuellement exclusifs? Aussi loin que je peux voir: formulaire peut avoir ses propres erreurs ainsi que les enfants.Pour mes messages flash j'ai été heureux avec
$form->getErrorsAsString()
Modifier (à partir de Benji_X80):
Pour SF3 utilisation
$form->getErrors(true, false);
This method should only be used to help debug a form.
(source)Traduction Des Messages D'Erreur (Symfony2.1)
J'ai été aux prises beaucoup à trouver cette information donc je pense que c'est certainement la peine d'ajouter une note sur la traduction des erreurs de forme.
@Icode4food
réponse sera de retour toutes les erreurs d'un formulaire. Toutefois, le tableau qui est retourné à ne pas prendre en compte, soit la pluralisation des messages ou traduction.Vous pouvez modifier la boucle foreach de
@Icode4food
réponse à un combo:Ici, il est:
Cette réponse a été mis en place à partir de 3 différents postes:
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Je suis soupçonner c'est pour Symfony 2.1 seule?Vous pouvez également utiliser le service validator pour obtenir des violations de contrainte:
Traduction Des Messages D'Erreur (Symfony2.3)
Ma version de résoudre le problème:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
Dans Symfony 2.5 vous pouvez obtenir tous les champs des erreurs très facile:
SYMFONY 3.X
Autres SF 3.X les méthodes indiquées ici ne fonctionne pas pour moi parce que je pouvais envoyer les données vide à la forme (mais j'ai NotNull/NotBlanck contraintes). Dans ce cas, la chaîne de l'erreur devrait ressembler à ceci :
Qui n'est pas très utile. J'ai donc fait ceci:
Qui permettrait le retour que :
Pour Symfony 3.2 et au-dessus de l'utiliser,
Utilisation str_replace si vous voulez vous débarrasser de l'ennuyeux 'Erreur: texte dans chaque description de l'erreur de texte.
Si vous utilisez les validateurs personnalisés, Symfony ne retourne pas d'erreurs générés par ces validateurs dans
$form->getErrors()
.$form->getErrorsAsString()
sera de retour toutes les erreurs que vous avez besoin, mais sa sortie est malheureusement formaté comme une chaîne de caractères, pas un tableau.La méthode que vous utilisez pour obtenir toutes les erreurs (peu importe d'où ils viennent), dépend de la version de Symfony que vous utilisez.
La plupart des solutions proposées impliquent la création d'une fonction récursive, qui analyse toutes les formes d'enfants, et des extraits pertinents des erreurs dans un tableau. Symfony 2.3 n'a pas le
$form->hasChildren()
fonction, mais il n'ont$form->all()
.Ici est une classe d'assistance pour Symfony 2.3, que vous pouvez utiliser pour extraire toutes les erreurs de toute forme.
(Il est basé sur le code d'un commentaire par yapro sur un bogue lié à un ticket de Symfony github compte.)
Code d'appel:
Basé sur @Jay Seth réponse, j'ai fait une version de FormErrors classe surtout pour Ajax Formes:
D'utilisation (par exemple dans votre action):
Version de Symfony: 2.8.4
Exemple de réponse JSON:
L'objet d'erreur contient le champ "clé", qui est l'id de l'entrée de l'élément DOM, de sorte que vous pouvez remplir facilement les messages d'erreur.
Si vous avez de l'enfant se forme à l'intérieur de la mère, n'oubliez pas d'ajouter le
cascade_validation
option à l'intérieur de la mère du formulairesetDefaults
.Pour Symfony 2.1, et ce, pour une utilisation avec des Rameaux d'affichage d'erreur j'ai modifié la fonction pour ajouter un FormError au lieu de simplement les récupérer, de cette façon, vous avez plus de contrôle sur les erreurs et ne pas avoir à utiliser error_bubbling sur chaque entrée. Si vous ne définissez pas de la manière ci-dessous {{ form_errors(form) }} restera vide:
$form->getErrors() fonctionne pour moi.
Je suis venu avec cette solution. Il fonctionne solide avec la dernière Symfony 2.4.
Je vais essayer de donner quelques explications.
À l'aide d'une validateur
Je pense que c'est une mauvaise idée d'utiliser distinct de validation pour valider les entités et retour violation de la contrainte de messages, comme suggéré par d'autres auteurs.
Vous devez valider manuellement toutes les entités, spécifiez les groupes de validation, etc, etc. Avec le complexe des formes hiérarchiques, il n'est pas pratique du tout et va sortir de mains rapidement.
Cette façon vous serez en validant le formulaire deux fois: une fois avec le formulaire et une fois avec distinct du programme de validation. C'est une mauvaise idée du point de vue des performances.
Je suggère de manière récursive itération de type de formulaire avec ses enfants à recueillir des messages d'erreur.
À l'aide de certaines méthodes proposées avec exclusif SI l'instruction
Quelques réponses suggéré par un autre auteurs contiennent mutuellement exclusives SI ce type de déclarations:
if ($form->count() > 0)
ouif ($form->hasChildren())
.Aussi loin que je peux voir, chaque formulaire peut contenir des erreurs, ainsi que les enfants. Je ne suis pas expert avec Formulaires Symfony composant, mais dans la pratique, vous n'obtiendrez pas des erreurs de la forme elle-même, comme protection CSRF erreur ou champs supplémentaires erreur. Je suggère de supprimer cette séparation.
À l'aide de dénormalisée résultat de la structure
Certains auteurs suggèrent de mettre toutes les erreurs à l'intérieur d'un simple tableau. De sorte que tous les messages d'erreur de la forme elle-même et de ses enfants sera ajouté à le même tableau avec les différentes stratégies d'indexation: numéro de type d'erreurs, et le nom de base pour les enfants des erreurs. Je suggère d'utiliser les données normalisées de la structure de la forme:
De cette façon, le résultat peut être facilement répété plus tard.
Ma solution
Alors, voici ma solution à ce problème:
J'espère que ça aidera quelqu'un.
SYMFONY 3.1
J'ai simplement mis en œuvre une méthode statique pour gérer l'affichage des erreurs
Espérant aider
Pour Symfony 2.1:
C'est ma dernière solution avec la mise en beaucoup d'autres solutions: