Hier ist mein saveAction
Code (an den das Formular die Daten weiterleitet)
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();
}
Meine Frage ist: Wie bekomme ich die Fehler, wenn ich $form->isValid()
zurückkomme false
?
error_bubbling
in Ihrem Formulartyp auf true setzen , indem Sie die Option für jedes einzelne Feld explizit festlegen .$form->getErrors(true)
Fehler von untergeordneten Formularen einschließenSymfony 2.3 / 2.4:
Diese Funktion enthält alle Fehler. Diejenigen auf dem Formular wie "Das CSRF-Token ist ungültig. Bitte versuchen Sie, das Formular erneut einzureichen." sowie zusätzliche Fehler in den Formularkindern, bei denen kein Fehler auftritt.
So erhalten Sie alle Fehler als Zeichenfolge:
Symfony 2.5 / 3.0:
Dokumente:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (at unten:
The method Form::getErrorsAsString() was removed
)quelle
$errors[$child->getName()] = $this->getErrorMessages($child);
wurde eine Ausnahme ausgelöst , da getErrorMessages in der Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller- Komponente fehlte . Also habe ich es ersetzt durch$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
und ich dachte, es wird direkt in einem Controller und einem Teil der Symfony-API aufgerufen.Unten ist die Lösung, die für mich funktioniert hat. Diese Funktion befindet sich in einer Steuerung und gibt ein strukturiertes Array aller Fehlermeldungen und des Feldes zurück, das sie verursacht hat.
Symfony 2.0:
Symfony 2.1 und neuer:
quelle
$this->getFormErrors
sollte$this->getErrorMessages
in Symfony2.1 in Ihrem ProbeVerwenden Sie den Validator, um die Fehler für eine bestimmte Entität abzurufen
API-Referenz:
quelle
Um korrekte (übersetzbare) Nachrichten zu erhalten, die derzeit SF 2.6.3 verwenden, ist hier meine letzte Funktion (da keine der oben genannten Funktionen mehr zu funktionieren scheint):
Die Form :: getErrors () -Methode gibt jetzt eine Instanz von FormErrorIterator zurück , es sei denn, Sie ändern das zweite Argument ($ flatten) auf true . (Es wird dann eine FormError- Instanz zurückgegeben, und Sie müssen die getMessage () -Methode direkt ohne die current () -Methode aufrufen:
)
Das Wichtigste ist, das erste Argument auf true zu setzen, um die Fehler zu erhalten. Wenn Sie das zweite Argument ($ flatten) auf seinem Standardwert ( true ) belassen , werden FormError- Instanzen zurückgegeben, während FormErrorIterator- Instanzen zurückgegeben werden, wenn false festgelegt wird.
quelle
Für meine Flash-Nachrichten war ich zufrieden
$form->getErrorsAsString()
Bearbeiten (von Benji_X80): Für SF3 verwenden
$form->getErrors(true, false);
quelle
This method should only be used to help debug a form.
( Quelle )Die Funktion für Symfony 2.1 und neuer, ohne veraltete Funktion:
quelle
IF
Aussage? Warum schließt es sich gegenseitig aus? Soweit ich sehen kann: Form kann sowohl eigene Fehler als auch Kinder haben.Übersetzte Formularfehlermeldungen (Symfony2.1)
Ich habe viel Mühe gehabt, diese Informationen zu finden, daher denke ich, dass es sich definitiv lohnt, einen Hinweis zur Übersetzung von Formularfehlern hinzuzufügen.
@Icode4food
Die Antwort gibt alle Fehler eines Formulars zurück. Das zurückgegebene Array berücksichtigt jedoch weder die Nachrichtenpluralisierung noch die Übersetzung .Sie können die foreach-
@Icode4food
Antwortschleife so ändern , dass eine Kombination angezeigt wird:Hier ist es:
Diese Antwort wurde aus 3 verschiedenen Beiträgen zusammengestellt:
quelle
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Ich vermute, dass dies nur für Symfony 2.1 ist?SYMFONY 3.X.
Andere hier angegebene SF 3.X-Methoden haben bei mir nicht funktioniert, da ich leere Daten an das Formular senden konnte (aber ich habe NotNull / NotBlanck-Einschränkungen). In diesem Fall würde die Fehlerzeichenfolge folgendermaßen aussehen:
Welches ist nicht sehr nützlich. Also habe ich folgendes gemacht:
Welches würde das zurückgeben:
quelle
Sie können auch den Validator-Service verwenden, um Verstöße gegen Einschränkungen zu erhalten:
quelle
Übersetzte Formularfehlermeldungen (Symfony2.3)
Meine Version zur Lösung des Problems:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
In Symfony 2.5 können Sie alle Feldfehler sehr einfach erhalten:
quelle
Verwenden Sie für Symfony 3.2 und höher Folgendes :
Verwenden Sie str_replace, wenn Sie den lästigen Text " Fehler: " in jedem Fehlerbeschreibungstext entfernen möchten .
quelle
Wenn Sie benutzerdefinierte Validatoren verwenden, gibt Symfony keine Fehler zurück, die von diesen Validatoren in generiert wurden
$form->getErrors()
.$form->getErrorsAsString()
gibt alle Fehler zurück, die Sie benötigen, aber die Ausgabe ist leider als Zeichenfolge und nicht als Array formatiert.Die Methode, mit der Sie alle Fehler abrufen (unabhängig davon, woher sie stammen), hängt davon ab, welche Version von Symfony Sie verwenden.
Die meisten der vorgeschlagenen Lösungen umfassen das Erstellen einer rekursiven Funktion, die alle untergeordneten Formulare scannt und die relevanten Fehler in ein Array extrahiert. Symfony 2.3 hat die
$form->hasChildren()
Funktion nicht, aber es hat$form->all()
.Hier ist eine Hilfsklasse für Symfony 2.3, mit der Sie alle Fehler aus jedem Formular extrahieren können. (Es basiert auf Code aus einem Kommentar von yapro zu einem verwandten Bug-Ticket in Symfony's Github-Account.)
Aufrufcode:
quelle
Basierend auf der Antwort von @Jay Seth habe ich eine Version der FormErrors-Klasse speziell für Ajax Forms erstellt:
Verwendung (zB in Ihrer Aktion):
Symfony-Version: 2.8.4
Beispiel für eine JSON-Antwort:
Das Fehlerobjekt enthält das Feld "Schlüssel", das die ID des Eingabe-DOM-Elements ist, sodass Sie problemlos Fehlermeldungen ausfüllen können.
Wenn Sie untergeordnete Formulare im übergeordneten Formular haben, vergessen Sie nicht, die
cascade_validation
Option im übergeordneten Formular hinzuzufügensetDefaults
.quelle
Ab Symfony 2.1 für die Verwendung mit der Twig-Fehleranzeige habe ich die Funktion geändert, um einen FormError hinzuzufügen, anstatt sie einfach abzurufen. Auf diese Weise haben Sie mehr Kontrolle über Fehler und müssen nicht error_bubbling für jede einzelne Eingabe verwenden. Wenn Sie es nicht wie folgt einstellen, bleibt {{form_errors (form)}} leer:
quelle
$ form-> getErrors () funktioniert bei mir.
quelle
Ich habe diese Lösung gefunden. Es funktioniert solide mit dem neuesten Symfony 2.4 .
Ich werde versuchen, einige Erklärungen zu geben.
Separaten Validator verwenden
Ich denke, es ist eine schlechte Idee, eine separate Validierung zu verwenden, um Entitäten zu validieren und Nachrichten über Einschränkungsverletzungen zurückzugeben, wie von anderen Autoren vorgeschlagen.
Sie müssen alle Entitäten manuell validieren, Validierungsgruppen angeben usw. usw. Bei komplexen hierarchischen Formularen ist dies überhaupt nicht praktikabel und gerät schnell außer Kontrolle.
Auf diese Weise validieren Sie das Formular zweimal: einmal mit Formular und einmal mit separatem Validator. Dies ist aus Sicht der Leistung eine schlechte Idee.
Ich schlage vor, den Formulartyp mit seinen untergeordneten Elementen rekursiv zu iterieren, um Fehlermeldungen zu sammeln.
Verwendung einiger vorgeschlagener Methoden mit exklusiver IF-Anweisung
Einige von anderen Autoren vorgeschlagene Antworten enthalten sich gegenseitig ausschließende IF-Anweisungen wie diese:
if ($form->count() > 0)
oderif ($form->hasChildren())
.Soweit ich sehen kann, kann jedes Formular sowohl Fehler als auch Kinder enthalten. Ich bin kein Experte für Symfony Forms- Komponenten, aber in der Praxis werden einige Fehler des Formulars selbst nicht angezeigt , z. B. CSRF-Schutzfehler oder zusätzliche Felder . Ich schlage vor, diese Trennung zu entfernen.
Denormalisierte Ergebnisstruktur verwenden
Einige Autoren schlagen vor, alle Fehler in ein einfaches Array einzufügen. Daher werden alle Fehlermeldungen des Formulars selbst und seiner untergeordneten Elemente mit unterschiedlichen Indizierungsstrategien zum selben Array hinzugefügt: nummerbasiert für typeneigene Fehler und namenbasiert für untergeordnete Fehler. Ich schlage vor, eine normalisierte Datenstruktur des Formulars zu verwenden:
Auf diese Weise kann das Ergebnis später leicht wiederholt werden.
Meine Lösung
Hier ist meine Lösung für dieses Problem:
Ich hoffe es wird jemandem helfen.
quelle
SYMFONY 3.1
Ich habe einfach eine statische Methode implementiert, um die Anzeige von Fehlern zu behandeln
Ich hoffe zu helfen
quelle
Symfony 3 und neuer
Ich habe kürzlich eine Funktion erstellt, die einen Baum von Formularfehlern erstellt. Dies ist hilfreich, um die Liste der Fehler an das Front-End zurückzugeben. Dies basiert auf Formulartypen mit:
Code:
Ausgabe:
Hinweis : Ich weiß, dass Fehler aus Feldern auf tieferen Ebenen überschrieben werden können, wenn auf höheren Ebenen Fehler auftreten. Dies ist jedoch für meine Verwendung beabsichtigt.
quelle
Für Symfony 2.1:
Dies ist meine endgültige Lösung, die viele andere Lösungen zusammenfasst:
quelle