it-swarm.com.de

Symfony2 ungültiges Formular ohne Fehler

Ich habe ein Problem mit einem von Symfony2 generierten CRUD-Formular .. (Mit MongoDB-Dokumenten, aber ich glaube nicht, dass dies damit zusammenhängt)

Wenn ich in der createAction () -Methode meines Controllers das Formularergebnis debugge:

$form->isValid() // returns false

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

Ich bekomme also nichts mit form_errors(form) auf meiner Zweigvorlage (was wegen $form->getErrors() leerer Return normal erscheint)

Und die geschriebenen Werte werden in der Form nicht ersetzt ...

Hat jemand eine Idee?

57

Das erste, was zu verstehen ist, ist die Validierung am Modell, nicht am Formular. Das Formular kann Fehler enthalten, jedoch nur, wenn der Eigenschaft ein Feld zugeordnet ist, das nicht überprüft wird. Wenn Ihr Formular also kein ungültiges Feld enthält (möglicherweise eine NotNull-Assertion für eine Eigenschaft, die sich nicht im Formular befindet), wird der Fehler nicht angezeigt.

Die zweite Sache ist, dass $form->getErrors() nur Fehler für diese Ebene anzeigt. Jedes untergeordnete Formular kann seine eigenen Fehler enthalten. Wenn Sie also die Fehler überprüfen möchten, sollten Sie die Felder durchlaufen und in jedem Feld getErrors aufrufen. Die getErrors-Methode der Form-Klasse kann auf diese Weise täuschen.

60
Peter Kruithof

Verwenden Sie zum Debuggen eines Formulars $form->getErrorsAsString() anstelle von $form->getErrors()

$form->getErrorsAsString() sollte nur zum Debuggen des Formulars verwendet werden. Es enthält die Fehler aller untergeordneten Elemente. Dies ist nicht der Fall von $form->getErrors()

Wie Peter erwähnt, gibt $form->getErrors() nicht die Summe aller Fehler der untergeordneten Formulare zurück. 

Um zu verstehen, wie ein Formular ungültig sein kann und ein getErrors () ein leeres Array zurückgibt, können Sie die isValid () - Methode der symfony-Formularklasse betrachten. Wie Sie sehen, gibt es zwei Fälle, in denen das Formular nicht gültig ist, der erste Test für das allgemeine Formular und der zweite Falltest für jedes untergeordnete Element.

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

Daher kann jedes untergeordnete Formular einen Fehler enthalten, aber $form->getErrors() selbst gibt nicht alle Fehler zurück. Bei einem Formular, das viele untergeordnete Elemente enthält, haben Sie im Allgemeinen $ form-> getErrors () mit einem CSRF-Fehler, wenn die CSRF nicht korrekt ist.

61
Mick

Update für Symfony 2.6

Abhängig von Ihrer Symfony2-Version:

symfony2.3

die($form->getErrorsAsString());

Seit symfony2.5 ist die Funktion getErrorsAsString() veraltet (wird in Symfony3 entfernt) und Sie sollten die folgende Methode verwenden:

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

Ab symfony2.6 können Sie auch die Funktion dump (dev-Umgebung) verwenden, wenn Sie die DebugBundle aktiviert haben:

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

Ich habe gerade das gleiche Problem. Für mich war das Formular nicht gültig, aber ich konnte mit $form->getErrors() oder $form->getErrorsAsString() keine Fehler erhalten. Später stellte ich fest, dass ich vergessen habe, das CSRF-Token an das Formular zu übergeben, damit es nicht übermittelt wird, und $form->handleRequest($request) hat nichts getan (keine Bestätigung). Als ich die Antwort von @ pits sah, versuchte ich es zu benutzen

$form->submit($request);

$form->getErrorsAsString();

es wurde ein Fehler zurückgegeben:

FEHLER: Das CSRF-Token ist ungültig. Bitte versuchen Sie das Formular erneut zu senden.

Hier einige Erklärungen in der Dokumentation zu Symfony2: http://symfony.com/doc/current/book/forms.html#handling-form-submissions

18
micmia

Für Symfony (> = 3.2 - 4) können Sie Folgendes verwenden:

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

die Fehler offensichtlich zu sehen.

4
Somen Diégo

Ab Symfony 3 sollten Sie gemäß Dokumentation die neue Implementierung verwenden:

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

Dadurch werden alle Fehler als eine Zeichenfolge zurückgegeben.

4
Adam

Für mich wurde das Formular nicht gesendet, auch wenn ich einen Senden-Button hatte

$request = $this->get('request');
if($request->isMethod("POST")){
      $form->submit($request);
        if($form->isValid()){
        // now true
        }
}
3
pit

Ja Es ist richtig, was es sagt Peter Kruithof In SF 2.8 ist dies meine Funktion, um die Fehler der Felder zu ermitteln 

 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

Wenn Sie Daten über AJAX senden, haben Sie möglicherweise versäumt, den Namen des Formulars in Ihre Datenschlüssel aufzunehmen und sind daher "Opfer" von…

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

Beim Versuch, die Anforderung zu bearbeiten, hat der Anforderungsverarbeitungsmechanismus den Namen Ihres Formulars in den GET/POST-Daten (Bedeutung als Array) nicht gefunden.

Wenn Sie ein Formular wie üblich rendern, enthält jedes seiner Felder den Namen des Formulars als Präfix in seinem Namensattribut my_form[child_field_name].

Fügen Sie bei Verwendung von ajax den Namen Ihres Formulars als Präfix in data hinzu!

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

Ich bin auf diesen Fehler gestoßen und habe festgestellt, dass ich vergessen habe, die Anfrage zu "bearbeiten". Stellen Sie sicher, dass Sie das in der Nähe haben ...

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

Es scheint, als hätten Sie ein Validierungsproblem. Das Formular wird beim Senden nicht bestätigt. Ich gehe davon aus, dass Sie Annotations für Ihre Validierung verwenden. Stellen Sie sicher, dass Sie dies oben in der Entität haben.

use Symfony\Component\Validator\Constraints as Assert;

und auch dies über jeder Eigenschaft

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

Die NotBlank() kann in eine beliebige Einschränkung geändert werden, um sie an Ihre Bedürfnisse anzupassen.

Weitere Informationen zur Validierung finden Sie unter: http://symfony.com/doc/current/book/validation.html

Weitere Informationen zu Assert-Einschränkungen finden Sie unter: http://symfony.com/doc/current/book/validation.html#constraints

0
Dave Mascia