web-dev-qa-db-fra.com

Symfony2 formulaire non valide sans erreur

J'ai un problème avec un formulaire CRUD généré par Symfony2 ..__ (avec les documents MongoDB, mais je ne pense pas que cela soit lié)

Dans la méthode createAction () de mon contrôleur, lorsque je débogue le résultat du formulaire:

$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 sous la forme ...

Est-ce que quelqu'un a une idée?

57
Flo-Schield-Bobby

La première chose à comprendre est que la validation est faite sur le modèle, pas sur le formulaire. Le formulaire peut contenir des erreurs, mais uniquement si un champ est mappé sur la propriété non validée. Donc, si votre formulaire ne contient pas le champ non valide (peut-être une assertion NotNull sur une propriété qui n'est pas dans le formulaire), l'erreur ne sera pas affichée.

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

60
Peter Kruithof

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

$form->getErrorsAsString() ne devrait ê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 Peter le mentionne, $form->getErrors() ne retournera pas la somme de toutes les erreurs des formulaires enfants. 

Pour comprendre comment un formulaire peut être invalide et que getErrors () renvoie un tableau vide, consultez la méthode isValid () de la classe de formulaire symfony. Comme vous pouvez le constater, 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 de cas 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;
}

Par conséquent, chaque enfant de formulaire peut contenir une erreur, mais $form->getErrors() ne renverra pas toutes les erreurs. Considérant un formulaire qui a beaucoup d'éléments enfants, vous aurez généralement $ form-> getErrors () avec une erreur CSRF si le CSRF n'est pas correct.

61
Mick

Mise à jour pour Symfony 2.6

Donc, selon votre version de Symfony2:

symfony2.3

die($form->getErrorsAsString());

Depuis symfony2.5 , la fonction getErrorsAsString() est obsolète (elle sera supprimée dans Symfony3) et vous devez utiliser la méthode suivante:

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

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

dump((string) $form->getErrors());     // Main errors
dump((string) $form->getErrors(true)); // Main and child errors
49
COil

Je viens d'avoir le même problème. Pour moi, le formulaire n'était pas valide, mais je n'ai pas pu obtenir d'erreur en utilisant $form->getErrors() ou $form->getErrorsAsString(). J’ai par la suite découvert que j’avais oublié de transmettre le jeton CSRF au formulaire afin qu’il ne soit pas soumis et que $form->handleRequest($request) ne fasse rien (aucune validation). En voyant 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 à nouveau le formulaire.

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

18
micmia

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
Somen Diégo

Pour moi, le formulaire n'a pas été soumis, même si j'avais un bouton d'envoi .. 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
pit

Oui, c'est correct, ce qu'il dit Peter Kruithof Dans SF 2.8, ma fonction est de récupérer 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;
}
2
ederrafo

Si vous envoyez des données via AJAX , vous avez peut-être manqué d'inclure le nom du formulaire sur vos clés de données et vous ê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

En d'autres termes, lors de la tentative de traitement de la demande, le mécanisme de traitement de la demande n'a pas trouvé le nom de votre formulaire dans les données GET/POST (c'est-à-dire un tableau).

Lorsque vous rendez un formulaire de manière habituelle, chacun de ses champs contient le nom de votre formulaire comme préfixe dans l'attribut de nom my_form[child_field_name].

Lorsque vous utilisez ajax, ajoutez le nom de votre formulaire comme préfixe dans les données!

data : {
    "my_form" : {
       "field_one" : "field_one_value"
       ...
    }
}
2
Stphane

Je suis tombé sur cette erreur et j'ai constaté que j'oubliais de "gérer" la demande. Assurez-vous que vous avez ça 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
Layton Everson

Il semble que vous ayez un problème de validation. Le formulaire n'est pas valide lors de la soumission. Je vais supposer que vous utilisez Annotations pour votre validation. Assurez-vous que cela figure en haut de l'entité.

use Symfony\Component\Validator\Constraints as Assert;

et aussi au-dessus de chaque propriété

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

La NotBlank() peut être changée en n'importe quelle contrainte pour répondre à vos besoins.

Vous trouverez plus d’informations sur la validation à l’adresse suivante: http://symfony.com/doc/current/book/validation.html

Pour plus d’informations sur les contraintes d’Assert, visitez le site: http://symfony.com/doc/current/book/validation.html#constraints

0
Dave Mascia