Symfony2 formulaire invalide sans erreur

j'ai un problème avec un formulaire CRUD généré par Symfony2. (Avec MongoDB Documents, mais je ne pense pas que ce soit lié)

dans la méthode createAction() de mon controller, quand je corrige le résultat de la forme:

$form->isValid() // returns false

$form->getErrors() // returns en empty array(0) {}

donc, je n'obtiens rien en utilisant form_errors(form) sur mon modèle de brindille (ce qui semble normal à cause de $form->getErrors() retour vide)

et les valeurs écrites ne sont pas remplacées dans la forme...

quelqu'un a une idée?

55
demandé sur Flo-Schield-Bobby 2012-06-26 17:58:14
la source

11 ответов

La première chose à comprendre est que la validation est effectuée sur le modèle, pas la forme. Le formulaire peut contenir des erreurs, mais seulement s'il a un champ associé à la propriété qui ne valide pas. Ainsi, si votre formulaire ne contient pas le champ invalide (peut-être une assertion NotNull sur une propriété qui n'est pas dans le formulaire), il ne montrera pas l'erreur.

la deuxième chose est que $form->getErrors() ne montrera des erreurs pour ce niveau, chaque enfant de forme peut contenir ses propres erreurs. Si si vous voulez vérifier les erreurs, vous devez boucle à travers les champs et appel getErrors sur chaque champ. La méthode getErrors sur la classe de forme peut être trompeuse de cette façon.

57
répondu Peter Kruithof 2012-06-27 23:47:01
la source

pour déboguer un formulaire, utilisez $form->getErrorsAsString() au lieu de $form->getErrors() .

$form->getErrorsAsString() ne doit être utilisé que pour déboguer le formulaire...il contiendra les erreurs de chaque élément enfant ce qui n'est pas le cas de $form->getErrors() .

comme Pierre le mentionne, $form->getErrors() ne retournera pas la somme de toutes les erreurs des enfants.

pour comprendre comment un formulaire peut être invalide et avoir un getErrors () retournant un tableau vide, vous peut avoir un regard sur la méthode isValid () de la classe de forme symfony. Comme vous pouvez le voir, il y a 2 cas où le formulaire n'est pas valide, le premier test pour le formulaire général, et le second test pour chaque élément enfant.

public function isValid()
{
    //...

    //CASE I : IF CHILD ELEMENTS HAVE ERRORS, $this->errors WILL CONTAIN
    //THE ERROR ON THE CHILD ELEMENT AND NOT ON THE GENERAL 'errors' FIELD 
    //ITSELF

    if (count($this->errors) > 0) {
        return false;
    }

    //CASE II: AND THIS IS WHY WE ARE TESTING THE CHILD ELEMENTS AS WELL
    //TO CHECK WHETHER THERE ARE VALID OR NOT

    if (!$this->isDisabled()) {
        foreach ($this->children as $child) {
            if (!$child->isValid()) {
                return false;
            }
        }
    }

    return true;
}

donc chaque enfant de forme peut contenir une erreur, mais $form->getErrors() lui-même ne retournera pas toutes les erreurs. Considérant un formulaire qui a de nombreux éléments enfant, vous aurez généralement $ form->getErrors () avec un CSRF erreur si le CSRF n'est pas correct.

59
répondu Mick 2015-02-18 16:27:34
la source

mise à jour pour Symfony 2.6

donc en fonction de vous Symfony2 version:

die($form->getErrorsAsString());

à partir de , la fonction getErrorsAsString() est dépréciée (sera supprimé en Symfony3) et vous devez utiliser la méthode suivante:

die((string) $form->getErrors());     // Main errors
die((string) $form->getErrors(true)); // Main and child errors

à partir de , vous pouvez également utiliser la fonction dump (environnement dev) si vous avez activé la fonction DebugBundle :

dump((string) $form->getErrors());     // Main errors
dump((string) $form->getErrors(true)); // Main and child errors
46
répondu COil 2015-10-15 15:28:48
la source

j'ai juste le même problème. Pour moi, le formulaire n'était pas valide, mais je ne pouvais pas obtenir d'erreurs en utilisant $form->getErrors() ou $form->getErrorsAsString() . Plus tard, j'ai découvert que j'avais oublié de passer le jeton CSRF au formulaire pour qu'il ne soit pas soumis, et $form->handleRequest($request) n'a rien fait (pas de validation). Comme j'ai vu la réponse de @pit, j'ai essayé d'utiliser

$form->submit($request);

$form->getErrorsAsString();

il a renvoyé une erreur:

Erreur

: le jeton CSRF n'est pas valide. Veuillez essayer de soumettre de nouveau le formulaire.

voici quelques explications dans la documentation de Symfony2: http://symfony.com/doc/current/book/forms.html#handling-form-submissions

18
répondu micmia 2015-05-12 19:40:36
la source

pour Symfony (>=3.2-4), Vous pouvez utiliser:

foreach($form->getErrors(true, false) as $er) {
    print_r($er->__toString());
}

pour voir les erreurs, évidemment.

4
répondu Somen Diégo 2017-10-18 12:54:08
la source

pour moi le formulaire n'a pas été soumis, même si j'avais un bouton Soumettre. J'ai ajouté le code pour résoudre le problème

$request = $this->get('request');
if($request->isMethod("POST")){
      $form->submit($request);
        if($form->isValid()){
        // now true
        }
}
3
répondu pit 2013-09-12 00:02:22
la source

à partir de Symfony 3, comme dans la documentation, vous devez utiliser la nouvelle implémentation:

$errors = (string) $form->getErrors(true, false);

cela retournera toutes les erreurs en une seule chaîne.

3
répondu Adam 2017-01-25 14:19:26
la source

si vous envoyez des données via AJAX , vous avez peut-être omis d'inclure le nom du formulaire sur vos clés de données et êtes donc" victime "de ...

# line 100 of Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php 
// Don't submit the form if it is not present in the request

ce qui signifie, en essayant de traiter la requête, que le mécanisme de traitement de la requête n'a pas trouvé le nom de votre formulaire dans les données GET/POST (c'est-à-dire comme un tableau).

lorsque vous rendez un formulaire de la manière habituelle, chacun de ses champs contient le nom de votre formulaire comme préfixe en leur attribut de nom my_form[child_field_name] .

lorsque vous utilisez ajax, ajoutez le nom de votre formulaire comme préfixe dans Données !

data : {
    "my_form" : {
       "field_one" : "field_one_value"
       ...
    }
}
2
répondu Stphane 2016-06-28 18:18:57
la source

Oui il est correct, ce qu'il dit Peter Kruithof Dans SF 2.8 c'est ma fonction, pour obtenir les erreurs des champs

 private function getErrorsForm(\Symfony\Component\Form\Form $form)
{
    $response =  array();

    foreach ($form as $child) {
         foreach ($child->getErrors(true) as $error) {
            $response[$child->getName()][] = $error->getMessage();
         }
    }

    return $response;
}
1
répondu ederrafo 2016-11-30 18:36:28
la source

j'ai découvert cette erreur et j'ai constaté que j'oubliais de" traiter " la demande. Assurez-vous d'avoir autour...

public function editAction(Request $request)
{
    $form = $this->createForm(new CustomType(),$dataObject);
    /**  This next line is the one I'm talking about... */
    $form->handleRequest($request);
    if ($request->getMethod() == "POST") {
        if ($form->isValid()) {
        ...
1
répondu Layton Everson 2016-12-14 08:30:44
la source

il apparaît que vous avez un problème de validation. La forme n'est pas la validation sur la présentation. Je suppose que vous utilisez des Annotations pour votre validation. Assurez-vous d'avoir en haut de l'entité.

use Symfony\Component\Validator\Constraints as Assert;

et aussi ceci au-dessus de chaque propriété

/**      
 * @Assert\NotBlank()      
 */

le NotBlank() peut être modifié à n'importe quelle contrainte pour s'adapter à vos besoins.

plus d'informations sur la validation peuvent être trouvées à: http://symfony.com/doc/current/book/validation.html

plus d'informations sur les contraintes Assert peuvent être trouvées à: http://symfony.com/doc/current/book/validation.html#constraints

0
répondu Dave Mascia 2012-06-28 05:19:06
la source

Autres questions sur