Hinzufügen von benutzerdefinierten Validierung Fehler zu Laravel form
Habe ich ein einfaches Formular eingerichtet, um Benutzern das ändern Ihrer E-Mail-Adresse, und ich mache die folgende überprüfung auf, bevor ich die E-Mail:
//Set up the form validation
$validator = Validator::make(
Input::all(),
array(
'email' => 'email|unique:users',
'password' => 'required'
)
);
//If validation fails, redirect to the settings page and send the errors
if ($validator->fails())
{
return Redirect::route('settings')->withErrors($validator)->withInput();
}
Dies funktioniert gut, aber nach dieser grundlegenden Validierung möchte ich überprüfen, ob der Benutzer gelieferten Eingabe des korrekten Passworts. Dazu mache ich die folgenden mit Laravel ist basic-authentication library:
//Find the user and validate their password
$user = Auth::user();
if (!Auth::validate(array('username' => $user->username, 'password' => Input::get('password'))))
{
die("failed to authenticate");
}
Eher als Umgang mit der Logik zu sagen, die Benutzer Ihr Passwort ist falsch, ich würde lieber nur ein form Fehler in der password
Eingabe, so zeigt es sich genauso wie normale Formular-Validierung. So etwas wie so:
if (!Auth::validate(array('username' => $user->username, 'password' => Input::get('password'))))
{
$validator->addError('password', 'That password is incorrect.');
return Redirect::route('settings')->withErrors($validator)->withInput();
}
So, das Passwort ist falsch Fehler wird angezeigt, neben meinem Passwort-Eingabe und schauen, wie die richtige form der Validierung.
Wie kann ich dies tun?
InformationsquelleAutor der Frage John Dorean | 2014-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Siehe Darren Craig ' s Antwort.
Einen Weg, um es zu implementieren aber.
InformationsquelleAutor der Antwort Bastian Hofmann
Gibt es ein problem mit der akzeptierten Antworten (und Laravel der Validator im Allgemeinen, meiner Meinung nach) - der Prozess der Validierung selbst-und Validierungs-status-Erkennung ist eingebunden in eine Methode.
Wenn Sie blind Rendern alle Prüfmeldungen aus der Tasche, es ist keine große Sache. Aber wenn Sie einige zusätzliche Logik, die erkennt, wenn der Prüfer versäumt hat oder nicht und führt zusätzliche Aktionen (z.B. Fütterung internationale SMS-Nachrichten für aktuelle geprüfter form-Felder), dann haben Sie ein problem.
Demonstration:
Auch,
ergibt die gleichen Ergebnisse. Warum? Denn wenn Sie sich in Laravel die Validator-code finden Sie im folgenden:
Wie Sie sehen können,
fails()
Methode im wesentlichen beseitigt die Tasche zu verlieren, alle Nachrichten, die Sie angefügt haben, und damit der validator davon aus, dass keine Fehler vorhanden sind.Gibt es keine Möglichkeit zum Anhängen von Fehler zu bestehende Prüfung und machen es scheitern. Sie können nur eine neue Prüfung mit benutzerdefinierten Fehler wie dieser:
Wenn Sie nicht wie die Idee des Missbrauchs
required
Gültigkeitsregel für benutzerdefinierte angehängt Fehler, Sie können immer erweitern, Laravel Prüfung mit benutzerdefinierten Regeln. Ich habe eine generischefailkey
Regel und machte es zwingend erforderlich, auf diese Weise:Und ich können es verwenden, wie diese:
Natürlich, das ist immer noch ein hacky Weg, um das Problem zu umgehen.
Im Idealfall würde ich eine Neugestaltung der Prüfung auf eine klare Trennung seiner Validierungsphase vom status Erkennung (separate Methoden für
validate()
undpasses()
oder besserisValid()
) und fügen Sie auch convenience-Methoden, um manuell scheitern bestimmtes Feld mit spezifischen Regeln. Obwohl, dass könnte auch als hacky, aber noch haben wir keine andere Wahl, wenn wir wollen Laravel validator nicht nur mit Laravel eigene Validierungsregeln, sondern auch unsere benutzerdefinierte Geschäftslogik Regeln.InformationsquelleAutor der Antwort JustAMartin
InformationsquelleAutor der Antwort zeros-and-ones
Darüber hinaus könnte es hilfreich sein, fügen Sie den folgenden
Redirect::back()
Funktion:Laut
(http://heera.it/laravel-manually-invalidate-validation#.VVt7Wfl_NBc)
InformationsquelleAutor der Antwort Pathros
Ich verstehen, warum Sie dies möchten, aber es ist wirklich eine schlechte Praxis aus der Sicht der Sicherheit für die Rückgabe einer Meldung, die angibt, ob der Benutzername und/oder das Passwort falsch ist. Es wäre damit ein hacker zu verstehen, ob Sie bekam den Benutzernamen und das Passwort korrekt sind.
Ist es besser, um wieder eine generische Meldung wie "Ihre Anmeldedaten sind falsch", die Sie nicht angezeigt haben möchten, neben Ihren Feldern sowieso.
InformationsquelleAutor der Antwort Darren Craig
Löste ich ein ähnliches problem mit der überprüfung und benutzerdefinierte überprüfung. In meinem Fall, ich brauche, um zu überprüfen, dass die hochgeladene Datei mit dem Formular ist eine gültige Bild-und auch die post-Daten, so brauche ich, um eine Validierung durchzuführen-test für die Datei und die Validierung von tests für die post-Daten. Ich war ein problem, als ich versucht habe zurück zu kommen, meine benutzerdefinierte Gültigkeitsprüfung Daten, nur Laravel - validation Fehler vorhanden war. Laut @JustAMartin post, ich habe codiert wurde, eine Lösung, die zeigt, dass alle Fehler.
Wie Sie sehen können ich macht nur ein Anruf an $validator->geht() und ich Speichere das Ergebnis in einer Variablen. Wenn ich diese Methode aufrufen, die alle tests Laravel sind maked. Ob Sie bestanden hat oder nicht, das Ergebnis wird in der Variablen gespeichert, so können Sie testen Sie Ihre variable später. Ermöglicht die Prüfung auf die Datei, um schließlich festzustellen, ob alle Daten OK sind oder nicht.
Wenn Fehler vorhanden sind, ich-Umleitung, mit der anzeigen () - Helfer, hinzufügen aller Daten: input und Fehler. Wenn dort sind keine Fehler das normale Verhalten der Methode fortgesetzt wird.
InformationsquelleAutor der Antwort Guillermo Espert