Was sind eigene Validierungsregeln?
Laravel bietet zahlreiche eingebaute Validierungsregeln, aber manchmal brauchen Sie anwendungsspezifische Prüfungen. Eigene Validierungsregeln erlauben es, Prüflogik als Klasse oder Closure zu definieren und wie eine Standardregel zu verwenden. Es gibt im Wesentlichen zwei Wege, eigene Regeln zu definieren:- Rule-Objekt — hoch wiederverwendbar und gut testbar
- Closure — passend für einfache, einmalig verwendete Regeln
Rule-Objekte
Rule-Klasse erzeugen
Erzeugen Sie eine neue Rule-Klasse mit dem Artisan-Kommandomake:rule. Sie landet unter app/Rules.
Das Interface ValidationRule implementieren
Implementieren Sie in der generierten Klasse die Methodevalidate. Bei Fehlschlag rufen Sie die Closure $fail auf.
$fail übergebenen Zeichenkette dürfen Sie den Platzhalter :attribute verwenden — Laravel ersetzt ihn durch den Feldnamen.
Rule-Objekt anwenden
Übergeben Sie eine Instanz Ihrer Rule an das Validierungs-Array.rules() einer Form Request funktioniert es genauso.
Fehlermeldungen mit Übersetzungs-Keys
Statt eine Meldung fest im Code zu hinterlegen, können Sie einen Übersetzungs-Key verwenden.lang/de/validation.php ein.
Mehrere Fehlermeldungen ausgeben
Um für ein Feld mehrere Fehler zu melden, rufen Sie$fail mehrfach auf.
Closure-basierte Regeln
Für einfache, nur einmalig verwendete Regeln in einer Anwendung genügt eine Closure — Sie brauchen keine Klasse.Implizite Regeln (auch für leere Werte ausführen)
Standardmäßig laufen eigene Regeln nicht, wenn das Feld leer ist oder gar nicht vorhanden. Wenn Sie die Regel auch für leere Werte ausführen wollen, erzeugen Sie die Klasse mit der Option--implicit.
ImplicitRule. Dieses Interface hat selbst keine zusätzlichen Methoden — es dient als Signal an Laravel.
Zugriff auf Daten
DataAwareRule — Zugriff auf alle Formularfelder
Wenn Sie basierend auf Werten anderer Felder validieren wollen, implementieren SieDataAwareRule. setData wird automatisch vor Beginn der Validierung aufgerufen.
ValidatorAwareRule — Zugriff auf die Validator-Instanz
Um auf sämtliche Informationen des Validators (fehlgeschlagene Regeln, eigene Meldungen usw.) zuzugreifen, implementieren SieValidatorAwareRule.
Praktische Anwendungsfälle
Prüfung auf japanische Zeichen
Eine Regel, die den Zeichensatz prüft.Prüfung japanischer Telefonnummern
Eine Regel, die japanische Telefonnummernformate akzeptiert.Unique-Constraint mit Tenant-ID
Ein häufiges Muster in Multi-Tenant-Anwendungen: Eindeutigkeit innerhalb eines Tenant-Scope.1
Rule-Klasse anlegen
2
In der Form Request verwenden
3
Beim Update die eigene ID ausschließen
Beim Aktualisieren eines Datensatzes sollten Sie die eigene ID von der Duplikatsprüfung ausnehmen.
Regeln im Service Provider registrieren
Regeln mit Validator::extend() ergänzen
MitValidator::extend() können Sie eigene Regeln in String-Form ('rule_name') verwenden. Registrieren Sie sie in der Methode boot() des AppServiceProvider.
Statische Methode an der Rule-Klasse anfügen
Sie können der FacadeRule per Macro eine Methode hinzufügen und so eine fluent API wie Rule::myRule() anbieten.
Details der internen Implementierung
Werfen wir einen Blick darauf, wieIlluminate\Validation\Validator eigene Regeln aufruft.
Innerhalb des Validators verarbeitet validateAttribute() jedes Feld. Wenn die Regel ValidationRule implementiert, wird validateUsingCustomRule() aufgerufen.
ImplicitRule verarbeitet wird, entscheidet isImplicit(). Ist das Signal gesetzt, läuft die Regel auch bei leerem Wert.
Verwandte Seiten
Validierung (Einstieg)
Standardvorgehen für Validierung in Controllern und Form Requests.