Selbstvalidierende intelligente Modelle für das Eloquent ORM von Laravel Framework 5.
Basierend auf dem Aware-Bundle für Laravel 3 von Colby Rabideau.
Copyright (C) 2013-2015 Max Ehsan & Igor Santos
Besuchen Sie unsere Veröffentlichungsliste. Das Changelog wird dort erstellt :)
Fügen Sie laravelbook/ardent
als Anforderung zu composer.json
hinzu (siehe unsere neueste stabile Version auf den Badges!):
{"require": {"laravelbook/ardent": "3.*"}}
Aktualisieren Sie Ihre Pakete mit composer update
oder installieren Sie sie mit composer install
.
Sie können das Paket auch mit composer require laravelbook/ardent
hinzufügen und später die gewünschte Version angeben (im Moment ist dev-master
die beste Wahl).
Wenn Sie Ardent als eigenständiges ORM-Paket verwenden möchten, können Sie dies tun, indem Sie die folgende Konfiguration in der Boot-/Startdatei Ihres Projekts verwenden (natürlich ändern Sie die Eigenschaften entsprechend Ihrer Datenbank):
LaravelArdentArdentArdent::configureAsExternal(array( 'driver' => 'mysql', 'host' => 'localhost', 'port' => 3306, 'database' => 'my_system', 'username' => 'myself', 'password' => 'h4ckr', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci'), 'en'); //Englisch ist die Standardsprache für Nachrichten, kann leer gelassen werden
Einführung
Erste Schritte
Mühelose Validierung mit Ardent
Validierungsfehler abrufen
Überschreibende Validierung
Benutzerdefinierte Validierungsfehlermeldungen
Benutzerdefinierte Validierungsregeln
Modellhaken
Sauberere Definition von Beziehungen
Versorgen Sie leidenschaftliche Wesen automatisch mit Feuchtigkeit
Redundante Formulardaten automatisch löschen
Sichere Textattribute automatisch umwandeln
Updates mit eindeutigen Regeln
Wie oft müssen Sie in den von Ihnen erstellten Anwendungen denselben Standardcode neu erstellen? Kommt Ihnen dieser typische Formularverarbeitungscode nur allzu bekannt vor?
Route::post('register', function() {$rules = array('name' => 'required|between:3,80|alpha_dash','email' => 'required|between:5,64|email |unique:users','password' => 'required|min:6|confirmed','password_confirmation' => 'required|min:6');$validator = Validator::make(Input::all(), $rules);if ($validator->passes()) { User::create(array('name' => Input::get('name'),'email' => Input::get('email'),'password' => Hash::make(Input:: get('Passwort')) ));return Redirect::to('/')->with('message', 'Danke für die Registrierung!'); } else {return Redirect::to('/')->withErrors($validator->getMessages()); } } );
Wenn Sie dies selbst implementieren, entsteht oft eine Menge wiederholter Boilerplate-Code. Als zusätzlicher Bonus werden Ihre Controller (oder Routenhandler) vorzeitig fett und Ihr Code wird chaotisch, hässlich und schwer zu verstehen.
Was wäre, wenn jemand anderes die ganze schwere Arbeit für Sie erledigen würde? Was wäre, wenn Sie, anstatt das obige Durcheinander wieder hervorzuwürgen, nur diese wenigen Zeilen tippen müssten?
Route::post('register', function() {$user = new User;if ($user->save()) {return Redirect::to('/')->with('message', 'Danke zur Anmeldung!'); } else {return Redirect::to('/')->withErrors($user->errors()); } } );
Treten Sie ein, Ardent!
Ardent – die mit magischem Staub betriebene, handgelenkfreundliche Komplettlösung für alle Ihre öden Eingangsdesinfektions-Boilerplates!
Abgesehen von Wortspielen kann das Schreiben und Warten von Eingabevalidierungsfunktionen schnell mühsam werden. Ardent beseitigt diese Komplexität, indem es Helfer zur Automatisierung vieler sich wiederholender Aufgaben bereitstellt.
Ardent eignet sich jedoch nicht nur hervorragend zur Eingabevalidierung, sondern hilft Ihnen auch dabei, Ihren Eloquent-Datenmodellcode erheblich zu reduzieren. Ardent ist besonders nützlich, wenn Sie mühsam immer wieder sehr ähnlichen Code in mehreren einzelnen Anwendungen schreiben.
Beispielsweise ist die Benutzerregistrierung oder das Einreichen von Blogbeiträgen eine häufige Codierungsanforderung, die Sie möglicherweise in einer Anwendung implementieren und in anderen Anwendungen wiederverwenden möchten. Mit Ardent können Sie Ihre selbstbewussten, intelligenten Modelle nur einmal schreiben und sie dann (ohne oder mit sehr geringen Änderungen) in anderen Projekten wiederverwenden. Sobald Sie sich an diese Vorgehensweise gewöhnt haben, werden Sie sich ernsthaft fragen, wie Sie jemals ohne Ardent zurechtgekommen sind.
Keine wiederholten Hirnverletzungen mehr für Sie!
Ziel Ardent
ist es, die Eloquent
Basisklasse zu erweitern, ohne ihre Kernfunktionalität zu ändern. Da Ardent
selbst ein Nachkomme von IlluminateDatabaseEloquentModel
ist, sind alle Ihre Ardent
-Modelle vollständig mit Eloquent
kompatibel und können die volle Leistung von Laravels fantastischem OR/M nutzen.
Um ein neues Ardent-Modell zu erstellen, lassen Sie Ihre Modellklasse einfach von der Ardent
Basisklasse ableiten. In den nächsten Beispielen werden wir die vollständige Namespace-Klasse verwenden, um die Beispiele übersichtlicher zu gestalten. Wir empfehlen Ihnen jedoch, in allen Ihren Klassen die Verwendung von use
zu verwenden:
benutze LaravelArdentArdentArdent;class User erweitert Ardent {}
Hinweis: Sie können Ihre schlichten Eloquent-Modelle frei mit Ardent-Nachkommen kombinieren . Wenn ein Modellobjekt nicht auf vom Benutzer übermittelten Inhalten basiert und daher keine Validierung erfordert, können Sie die Eloquent-Modellklasse unverändert lassen.
Ardent-Modelle verwenden die integrierte Validator-Klasse von Laravel. Das Definieren von Validierungsregeln für ein Modell ist einfach und erfolgt normalerweise in Ihrer Modellklasse als statische Variable:
Klasse Benutzer erweitert LaravelArdentArdentArdent { public static $rules = array('name' => 'required|between:3,80|alpha_dash','email' => 'required|between:5,64|email|unique:users', 'password' => 'erforderlich|min:6|bestätigt','password_confirmation' => 'erforderlich|min:6', ); }
Hinweis : Sie können die Array-Syntax auch für Validierungsregeln verwenden. Ich hoffe, dass Ihnen der alte Link zu den Laravel-Dokumenten nichts ausmacht, aber so gut die Laravel-Dokumentation auch ist, klare Referenzen zu Pipe/Array-Syntaxen für Validierungsregeln sind seit 5.1 leider nicht mehr vorhanden.
Ardent-Modelle validieren sich automatisch, wenn Ardent->save()
aufgerufen wird.
$user = neuer Benutzer;$user->name = 'John doe';$user->email = '[email protected]';$user->password = 'test';$success = $user->save( ); // gibt false zurück, wenn das Modell ungültig ist
Hinweis: Sie können ein Modell auch jederzeit mit der Methode
Ardent->validate()
validieren.
Wenn die Validierung eines Ardent-Modells fehlschlägt, wird ein IlluminateSupportMessageBag
-Objekt an das Ardent-Objekt angehängt, das Meldungen zu Validierungsfehlern enthält.
Rufen Sie die Nachrichtensammlungsinstanz für Validierungsfehler mit der Methode Ardent->errors()
oder der Eigenschaft Ardent->validationErrors
ab.
Rufen Sie alle Validierungsfehler mit Ardent->errors()->all()
ab. Rufen Sie Fehler für ein bestimmtes Attribut mit Ardent->validationErrors->get('attribute')
.
Hinweis: Ardent nutzt das MessagesBag-Objekt von Laravel, das eine einfache und elegante Methode zum Formatieren von Fehlern bietet.
Es gibt zwei Möglichkeiten, die Validierung von Ardent zu überschreiben:
forceSave()
validiert das Modell, speichert es jedoch unabhängig davon, ob Validierungsfehler vorliegen oder nicht.
Sowohl Ardent->save($rules, $customMessages)
als auch Ardent->validate($rules, $customMessages)
nehmen zwei Parameter an:
$rules
ist ein Array von Validator-Regeln in der gleichen Form wie Ardent::$rules
.
Das Gleiche gilt für den Parameter $customMessages
(identisch mit Ardent::$customMessages
).
Ein Array, das nicht leer ist, überschreibt die von der Klasse angegebenen Regeln oder benutzerdefinierten Fehlermeldungen nur für diese Instanz der Methode.
Hinweis: Der Standardwert für
$rules
und$customMessages
ist emptyarray()
; Wenn Sie also einarray()
übergeben, wird nichts überschrieben.
Genau wie beim Laravel Validator können Sie mit Ardent benutzerdefinierte Fehlermeldungen mit derselben Syntax festlegen.
Klasse Benutzer erweitert LaravelArdentArdentArdent { public static $customMessages = array('required' => 'Das Feld :attribute ist erforderlich.', ... ); }
Sie können benutzerdefinierte Validierungsregeln auf die gleiche Weise erstellen wie für den Laravel Validator.
Ardent bietet gegenüber den Modellereignissen von Eloquent etwas syntaktischen Zucker: traditionelle Modell-Hooks. Sie sind eine einfache Möglichkeit, zusätzliche Vorgänge an verschiedene Momente in Ihrem Modellleben anzuschließen. Sie können verwendet werden, um vor dem Löschen eines Eintrags zusätzliche Aufräumarbeiten durchzuführen, automatische Korrekturen nach der Validierung durchzuführen oder verwandte Modelle nach einer Aktualisierung zu aktualisieren.
Bei allen before
Hooks wird der Vorgang angehalten, wenn false
(insbesondere boolesche, nicht einfach „falsche“ Werte) zurückgegeben werden. Wenn Sie beispielsweise das Speichern stoppen möchten, wenn in einer beforeSave
-Methode ein Fehler auftritt, geben Sie einfach return false
und die Speicherung findet nicht statt – und afterSave
wird natürlich auch nicht aufgerufen.
Hier ist die vollständige Liste der verfügbaren Hooks:
before
/ afterCreate()
before
/ afterSave()
before
/ afterUpdate()
before
/ afterDelete()
before
/ afterValidate()
– wenn false zurückgegeben wird, wird die Validierung angehalten, sodass auch save()
Vorgänge fehlschlagen, da die Validierung fehlgeschlagen ist.
Sie können beispielsweise beforeSave
verwenden, um das Passwort eines Benutzers zu hashen (eigentlich wäre es eine bessere Idee, automatisches Hashing zu verwenden!):
Klasse Benutzer erweitert LaravelArdentArdentArdent { öffentliche Funktion beforeSave() {// wenn es ein neues Passwort gibt, Hash itif($this->isDirty('password')) { $this->password = Hash::make($this->password ); } return true;//oder nichts zurückgeben, da nur ein boolescher Wert false den Vorgang anhält } }
beforeSave
und afterSave
können zur Laufzeit eingebunden werden. Übergeben Sie einfach Abschlüsse mit dem Modell als Argument an die Methode save()
(oder forceSave()
).
$user->save(array(), array(), array(), function ($model) { // Abschluss für beforeSaveecho "Speichern des Modellobjekts...";return true; }, function ($model) { // Abschluss für afterSaveecho "done!"; } );
Hinweis: Die Abschlüsse sollten einen Parameter haben, da ihnen ein Verweis auf das zu speichernde Modell übergeben wird.
Haben Sie jemals ein Eloquent-Modell mit einer Reihe von Beziehungen geschrieben, nur um dann zu bemerken, wie überladen Ihre Klasse ist, mit all diesen Einzeilern, die fast denselben Inhalt haben wie der Methodenname selbst?
In Ardent können Sie Ihre Beziehungen in einem Array mit ihren Informationen sauber definieren, und sie funktionieren genauso, als ob Sie sie in Methoden definiert hätten. Hier ist ein Beispiel:
Klasse Benutzer erweitert LaravelArdentArdentArdent { public static $relationsData = array('address' => array(self::HAS_ONE, 'Address'),'orders' => array(self::HAS_MANY, 'Order'),'groups' = > array(self::BELONGS_TO_MANY, 'Group', 'table' => 'groups_have_users') ); }$user = User::find($id);echo "{$user->address->street}, {$user->address->city} - {$user->address->state}";
Die Array-Syntax lautet wie folgt:
Erster indizierter Wert: Beziehungsname, einer von hasOne
, hasMany
, belongsTo
, belongsToMany
, morphTo
, morphOne
, morphMany
oder eine der zugehörigen Konstanten (z. B. Ardent::HAS_MANY
oder Ardent::MORPH_ONE
).
Zweiter Index: Klassenname mit vollständigem Namensraum. Die Ausnahme bilden morphTo
Beziehungen, die kein zusätzliches Argument annehmen.
benannte Argumente, die denen folgen, die für die ursprünglichen Eloquent-Methoden definiert wurden:
foreignKey
[optional], gültig für hasOne
, hasMany
, belongsTo
und belongsToMany
table
, otherKey
[optional], timestamps
[boolean, optional] und pivotKeys
[Array, optional], gültig für belongsToMany
name
, type
und id
, verwendet von morphTo
, morphOne
und morphMany
(für die letzten beiden muss name
definiert werden)
Hinweis: Diese Funktion basierte auf den einfachen Beziehungen von Yii 1.1 ActiveRecord.
Ardent ist in der Lage, Ihre Entitätsmodellklasse automatisch aus der Übermittlung der Formulareingabe zu hydrieren!
Lass es uns in Aktion sehen. Betrachten Sie diesen Codeausschnitt:
$user = neuer Benutzer;$user->name = Input::get('name');$user->email = Input::get('email');$user->password = Hash::make(Input ::get('password'));$user->save();
Lassen Sie uns die Magie von Ardent beschwören und den vorherigen Ausschnitt neu schreiben:
$user = neuer Benutzer;$user->save();
Das ist es! Wir haben lediglich das langweilige Zeug entfernt.
Ob Sie es glauben oder nicht, der obige Code führt im Wesentlichen die gleiche Aufgabe aus wie sein älterer, wenn auch recht ausführlicher Bruder. Ardent füllt das Modellobjekt mit Attributen aus vom Benutzer übermittelten Formulardaten. Kein mühsamer Versuch mehr, herauszufinden, welche Eloquent-Eigenschaft Sie vergessen haben auszufüllen. Lassen Sie Ardent sich um die langweiligen Dinge kümmern, während Sie sich mit den lustigen Dingen beschäftigen!
Es folgt intern den gleichen Massenzuweisungsregeln, abhängig von den $fillable
-/ $guarded
-Eigenschaften.
Um die automatische Hydratationsfunktion zu aktivieren, setzen Sie einfach die Instanzvariable $autoHydrateEntityFromInput
in Ihrer Modellklasse auf true
. Um jedoch das Füllen bereits vorhandener Eigenschaften zu verhindern, sollten Sie stattdessen $forceEntityHydrationFromInput
verwenden, wenn Sie die automatische Hydratation auch für Aktualisierungsszenarien wünschen:
Klasse Benutzer erweitert LaravelArdentArdentArdent { public $autoHydrateEntityFromInput = true; // hydratisiert bei der Validierung neuer Einträge public $forceEntityHydrationFromInput = true; // hydratisiert, wann immer die Validierung aufgerufen wird}
Ardent-Modelle können redundante Eingabedaten (z. B. Kennwortbestätigung , versteckte CSRF- _token
oder benutzerdefinierte HTTP- _method
) automatisch automatisch löschen, sodass die zusätzlichen Daten niemals in der Datenbank gespeichert werden. Ardent verwendet die Bestätigungsfelder, um die Formulareingabe zu validieren, und verwirft diese Attribute dann umsichtig, bevor die Modellinstanz in der Datenbank gespeichert wird!
Um diese Funktion zu aktivieren, setzen Sie einfach die Instanzvariable $autoPurgeRedundantAttributes
in Ihrer Modellklasse auf true
:
Klasse Benutzer erweitert LaravelArdentArdentArdent { public $autoPurgeRedundantAttributes = true; }
Sie können auch zusätzliche Felder löschen. Das Attribut Ardent::$purgeFilters
ist ein Array von Abschlüssen, zu denen Sie Ihre benutzerdefinierten Regeln hinzufügen können. Diese Abschlüsse erhalten den Attributschlüssel als Argument und sollten für Attribute, die gelöscht werden sollen, false
zurückgeben. So was:
function __construct($attributes = array()) { parent::__construct($attributes); $this->purgeFilters[] = function($key) {$purge = array('tempData', 'myAttribute');return ! in_array($key, $purge); }; }
Angenommen, Sie haben in Ihrer Modellklasse ein Attribut mit dem Namen password
, möchten aber die Klartextversion nicht in der Datenbank speichern. Die pragmatische Vorgehensweise wäre, den Hash des Originalinhalts zu speichern. Machen Sie sich keine Sorgen, Ardent ist in der Lage, beliebig viele sichere Felder automatisch für Sie zu transmogrifizieren!
Fügen Sie dazu den Attributnamen zur statischen Array-Variablen Ardent::$passwordAttributes
in Ihrer Modellklasse hinzu und setzen Sie die Instanzvariable $autoHashPasswordAttributes
auf true
:
Klasse Benutzer erweitert LaravelArdentArdentArdent { public static $passwordAttributes = array('password'); public $autoHashPasswordAttributes = true; }
Ardent ersetzt das Klartext-Passwortattribut automatisch durch eine sichere Hash-Prüfsumme und speichert es in der Datenbank. Es verwendet intern die Laravel Hash::make()
-Methode, um Hash zu generieren. Hinweis: Es wird empfohlen, das Attribut $hidden
von Eloquent zu verwenden, damit das Passwort, selbst gehasht, nicht so leicht herauskommt, wenn Sie eine API oder ähnliches erstellen :)
Falls Sie Ardent Standalone verwenden, können Sie Ardent::$hasher
verwenden, um den Feldwert zu überprüfen, indem Sie etwas wie User::$hasher->check($given_password, $user->password)
verwenden.
Ardent kann Sie mit einzigartigen Updates unterstützen. Laut der Laravel-Dokumentation müssen Sie beim Aktualisieren (und damit Validieren) eines Felds mit einer eindeutigen Regel die eindeutige ID des Datensatzes übergeben, den Sie aktualisieren. Ohne die Übergabe dieser ID schlägt die Validierung fehl, da der Validator von Laravel annimmt, dass es sich bei diesem Datensatz um ein Duplikat handelt.
Aus der Laravel-Dokumentation:
'email' => 'unique:users,email,10'
In der Vergangenheit mussten Programmierer die Übergabe der ID und die Änderung des Regelsatzes manuell verwalten, um die ID zur Laufzeit einzubeziehen. Nicht so bei Ardent. Richten Sie einfach Ihre Regeln mit unique
ein, rufen Sie die Funktion updateUniques
auf und Ardent kümmert sich um den Rest.
Definieren Sie in Ihrem erweiterten Modell Ihre Regeln
public static $rules = array( 'email' => 'required|email|unique', 'password' => 'required|between:4,20|confirmed', 'password_confirmation' => 'between:4,20', );
Wenn Sie in Ihrem Controller ein Update durchführen müssen, rufen Sie einfach auf
$model->updateUniques();
Bei Bedarf können Sie zur Laufzeit Regeln an updateUniques
übergeben, andernfalls werden die von Ihrem Modell bereitgestellten statischen Regeln verwendet.
Beachten Sie, dass wir im obigen Beispiel der Regeln dem Validator nicht mitgeteilt haben, welche Tabelle oder welches Feld er verwenden soll, wie in der Laravel-Dokumentation beschrieben (z. B. unique:users,email,10
). Ardent ist schlau genug, es herauszufinden. (Vielen Dank an Github-Benutzer @Sylph)