Validierung ist eine Eigenschaft für Laravel Eloquent-Modelle, die sicherstellt, dass Modelle ihre Validierungskriterien erfüllen, bevor sie gespeichert werden. Wenn sie als ungültig erachtet werden, wird das Modell nicht gespeichert und die Validierungsfehler werden verfügbar gemacht.
Die Validierung ermöglicht mehrere Regelsätze, das Einfügen der Modell-ID in unique
Validierungsregeln und das Auslösen von Ausnahmen bei fehlgeschlagenen Validierungen. Es ist klein und flexibel, passt perfekt in Ihren Arbeitsablauf und hilft Ihnen, nur gültige Daten zu speichern.
Möchten Sie Validating auf Laravel 4.2+ verwenden? Schauen Sie sich den Zweig 0.10.x an, um Dokumentation und Installationsanweisungen zu erhalten.
Die Laravel 4.2-Version eignet sich besser für die Formularvalidierung; Es unterstützt benutzerdefinierte Validierungsnachrichten, Bestätigungsregeln und mehrere Regelsätze. Da Laravel 5.0 über FormRequest
-Validierung verfügt, ist die Validierung nun darauf ausgelegt, Ihre Kerndaten gültig zu halten und die Formularvalidierung dem Framework zu überlassen.
Möchten Sie Validating auf Laravel 5.0 bis 5.2 verwenden? Schauen Sie sich den 2.x-Zweig an, um Dokumentation und Installationsanweisungen zu erhalten.
Die Laravel-Version 5.0–5.2 verwendete einen inzwischen veralteten ValidationException
Vertrag aus dem Laravel-Framework. Für Laravel 5.3 erweitern wir jetzt die Kernvalidierung ValidationException
, was bedeutet, dass das Framework automatisch mit Fehlern zurückleitet, wenn ein Validierungsfehler auftritt, ähnlich wie dies bei einer FormRequest
der Fall wäre.
Lesen Sie einfach weiter – diese Anleitung ist für Sie!
Gehen Sie einfach in Ihr Projektverzeichnis, in dem sich die Datei composer.json
befindet, und geben Sie Folgendes ein:
Komponist benötigt Watson/Validierung
Sehen Sie sich die Installationsanweisungen für Laravel 4.2+ an. Sehen Sie sich die Installationsanweisungen für Laravel 5.0 - 5.2 an.
Fügen Sie zunächst das Merkmal zu Ihrem Modell hinzu und fügen Sie nach Bedarf Ihre Validierungsregeln und Nachrichten hinzu.
Verwenden Sie WatsonValidatingValidatingTrait;class Post erweitert Eloquent { use ValidatingTrait; protected $rules = [ 'title' => 'required', 'slug' => 'required|unique:posts,slug', 'content' => 'required' ]; }
Sie können das Merkmal auch zu einem BaseModel
hinzufügen, wenn Sie eines verwenden, und es funktioniert auf allen Modellen, die davon ausgehen. Andernfalls können Sie einfach WatsonValidatingValidatingModel
anstelle von Eloquent
erweitern.
Hinweis: Sie müssen die Eigenschaft $rules
für alle Modelle festlegen, die von einem BaseModel
ausgehen, das das Merkmal verwendet, oder andernfalls ein leeres Array als $rules
für das BaseModel
festlegen. Wenn Sie dies nicht tun, erhalten Sie unweigerlich eine LogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
.
Jetzt haben Sie Zugriff auf einige angenehme Funktionen.
// Prüfen, ob das Modell gültig ist oder nicht.$post->isValid(); // true// Oder prüfen Sie, ob es ungültig ist oder nicht.$post->isInvalid(); // false// Sobald Sie die Gültigkeit des Modells ermittelt haben,// können Sie die Fehler abrufen.$post->getErrors(); // Fehler MessageBag
Auch die Modellvalidierung wird wirklich einfach.
if ( ! $post->save()) {// Oops.return restart()->route('posts.create') ->withErrors($post->getErrors()) ->withInput(); }return weitergeleitet()->route('posts.show', $post->id) ->withSuccess("Ihr Beitrag wurde erfolgreich gespeichert.");
Wenn Sie beim Validieren von Modellen lieber Ausnahmen verwenden möchten, können Sie andernfalls die Methode saveOrFail()
verwenden. Jetzt wird eine Ausnahme ausgelöst, wenn Sie versuchen, ein ungültiges Modell zu speichern.
$post->saveOrFail();
Sie müssen die Ausnahme nicht abfangen , wenn Sie dies nicht möchten. Laravel weiß, wie man mit einer ValidationException
umgeht und leitet bei Formulareingaben und Fehlern automatisch zurück. Wenn Sie es jedoch selbst in die Hand nehmen möchten, können Sie das gerne tun.
Versuchen Sie es mit {$post->saveOrFail(); } Catch (WatsonValidatingValidationException $e) {$errors = $e->getErrors();return restart()->route('posts.create') ->withErrors($errors) ->withInput(); }
Beachten Sie, dass Sie die Ausnahme einfach wie withErrors($e)
an die Methode withErrors withErrors()
übergeben können und Laravel weiß, wie damit umzugehen ist.
Wenn Sie das Modell verwenden und eine Speicherung durchführen möchten, die die Validierung umgeht, können Sie dies tun. Dadurch wird das gleiche Ergebnis zurückgegeben, als ob Sie save()
für ein Modell ohne das Merkmal aufgerufen hätten.
$post->forceSave();
Wenn Sie möchten, dass bei Verwendung der Methode save()
standardmäßig Ausnahmen ausgelöst werden, anstatt saveOrFail()
verwenden zu müssen, können Sie einfach die folgende Eigenschaft für Ihr Modell oder BaseModel
festlegen.
/** * Ob das Modell eine ValidationException auslösen soll, wenn die Validierung * fehlschlägt. Wenn es nicht festgelegt ist, wird standardmäßig „false“ verwendet. * * @var boolean */protected $throwValidationExceptions = true;
Wenn Sie eine einmalige Speicherung mithilfe von Ausnahmen oder Rückgabewerten durchführen möchten, können Sie die Methoden saveOrFail()
und saveOrReturn
verwenden.
Um benutzerdefinierte Validierungsfehlermeldungen anzuzeigen, fügen Sie einfach die Eigenschaft $validationMessages
zu Ihrem Modell hinzu.
/** * Validierungsnachrichten, die an den Validator weitergeleitet werden sollen. * * @var array */protected $validationMessages = ['slug.unique' => "Ein anderer Beitrag verwendet diesen Slug bereits."];
Sie haben vielleicht bemerkt, dass wir die unique
-Regel für den Slug verwenden, die nicht funktionieren würde, wenn wir ein persistentes Modell aktualisieren würden. Glücklicherweise übernimmt Validation dies für Sie und hängt den Primärschlüssel des Modells an die Regel an, damit die Regel wie erwartet funktioniert. Ignorieren des aktuellen Modells.
Sie können diese Funktionalität anpassen, indem Sie die Eigenschaft $injectUniqueIdentifier
für Ihr Modell festlegen.
/** * Ob das Modell seine Kennung in die eindeutigen * Validierungsregeln einfügen soll, bevor es eine Validierung versucht. Wenn diese Eigenschaft * im Modell nicht festgelegt ist, wird sie standardmäßig auf „true“ gesetzt. * * @var boolean */protected $injectUniqueIdentifier = true;
Standardmäßig unterstützen wir die von Laravel bereitgestellte unique
Regel. Wir unterstützen auch die beliebte felixkiss/uniquewith-validator-Regel, Sie müssen sich jedoch dafür anmelden. Fügen Sie einfach use WatsonValidatingInjectorsUniqueWithInjector
hinzu, nachdem Sie das Validierungsmerkmal importiert haben.
Wenn Sie möchten, ist es auch einfach, zusätzliche Injektionsregeln zu unterstützen. Angenommen, Sie möchten eine zusätzliche Regel namens unique_ids
unterstützen, die einfach den Primärschlüssel des Modells übernimmt (aus welchem Grund auch immer). Sie müssen lediglich eine Regel im Kamelgehäuse hinzufügen, die alle vorhandenen Parameter und den Feldnamen akzeptiert und die Ersetzungsregel zurückgibt.
/** * Bereiten Sie eine unique_ids-Regel vor und fügen Sie bei Bedarf eine Modellkennung hinzu. * * @param array $parameters * @param string $field * @return string */protected function PrepareUniqueIdsRule($parameters, $field) {// Führen Sie eine Ersetzung nur durch, wenn das Modell beibehalten wurde.if ($this->exists) {return 'unique_ids:' . $this->getKey(); }return 'unique_ids'; }
Wenn das Modell in diesem Fall gespeichert wurde und einen Primärschlüssel von 10
hat, wird die Regel unique_ids
durch unique_ids:10
ersetzt.
Während des Validierungsprozesses werden vom Merkmal verschiedene Ereignisse ausgelöst, in die Sie einbinden können, um den Validierungsprozess zu beeinflussen.
Um einzubinden, müssen Sie zunächst die Eigenschaft $observeables
zu Ihrem Modell (oder Basismodell) hinzufügen. Dadurch weiß Eloquent lediglich, dass Ihr Modell auf diese Ereignisse reagieren kann.
/** * Vom Benutzer bereitgestellte beobachtbare Ereignisse * * @var array */protected $observables = ['validating', 'validated'];
Wenn die Validierung bevorsteht, wird das Ereignis eloquent.validating: ModelName
ausgelöst, wobei der Parameter $event
saving
oder restoring
lautet. Wenn Sie beispielsweise ein Namespace-Modell AppUser
aktualisieren würden, wäre das Ereignis eloquent.validating: AppUser
. Wenn Sie auf eines dieser Ereignisse warten und einen Wert zurückgeben, können Sie verhindern, dass die Validierung vollständig erfolgt.
Event::listen('eloquent.validating:*', function($model, $event) {// Pseudo-Russisches Roulette validation.if (rand(1, 6) === 1) {return false; } });
Nach der Validierung gibt es auch eine Reihe validated
Ereignisse, in die Sie einbinden können, und zwar für die passed
, failed
und skipped
Ereignisse. Für das obige Beispiel, bei dem die Validierung fehlschlägt, könnten Sie das Ereignis eloquent.validated: AppUser
erhalten.
Derzeit gibt es in Laravel einen Fehler (siehe Problem Nr. 1181), der verhindert, dass Modellereignisse in einer Testsuite mehr als einmal ausgelöst werden. Das bedeutet, dass der erste Test, der Modelltests verwendet, bestanden wird, alle nachfolgenden Tests jedoch fehlschlagen. In diesem Thread sind einige vorübergehende Lösungen aufgeführt, mit denen Sie Ihre Tests in der Zwischenzeit bestehen können.
Da Laravel zum Zweck der Fehlerverfolgung und Pull-Requests auf Liferaft umgestiegen ist, ist das oben genannte Problem möglicherweise nicht verfügbar. Dieser Gist enthält ein Beispiel für TestCase.php
, das Ihnen zeigt, wie Sie die Ereignisse aller Ihrer Modelle zwischen Tests zurücksetzen, damit sie wie erwartet funktionieren.
Es gibt eine Reihe von Möglichkeiten, wie Sie das validierende Validierungsmodell in Ihren Controllern verwenden können. Hier ist jedoch ein Beispiel, das das neue FormRequest in Laravel 5 nutzt (wenn Sie ein anderes Controller-Beispiel ohne FormRequest sehen möchten, schauen Sie sich das an die Version 4.2+ dieses Pakets.
Dieses Beispiel hält Ihren Code sauber, indem es FormRequest ermöglicht, Ihre Formularvalidierung durchzuführen, und dem Modell, seine eigene Validierung durchzuführen. Durch die Aktivierung von Validierungsausnahmen können Sie sich wiederholenden Controller-Code reduzieren (Try/Catch-Blöcke) und Modellvalidierungsausnahmen global behandeln (Ihre Formularanfragen sollten Ihre Modelle gültig halten. Wenn Ihr Modell also ungültig wird, handelt es sich um ein Ausnahmeereignis ).
<?php Namespace AppHttpControllers;AppHttpRequestsPostFormRequest verwenden;IlluminateRoutingController verwenden;Klasse PostsController erweitert Controller {protected $post;public function __construct(Post $post) {$this->post = $post; }// ...öffentlicher Funktionsspeicher(PostFormRequest $request) {// Der Beitrag löst eine Ausnahme aus, wenn er ungültig ist.$post = $this->post->create($request->input());// Der Beitrag wurde erfolgreich gespeichert.return weitergeleitet()->route( 'posts.show', $post); } }
Sie können dann eine Modellvalidierungsausnahme in Ihrer app/Exceptions/Handler.php
abfangen und nach Bedarf damit umgehen.
öffentliche Funktion render($request, Exception $e) {if ($e Instanz von WatsonValidatingValidationException) {return back()->withErrors($e)->withInput(); }parent::render($request, $e); }