Eines der (wenigen) Dinge, die ich an Laravel nicht mag, ist, dass Sie den Validierungscode nicht einfach von Ihrem Controller auf Ihre Modelle verschieben können. Wenn ich Software schreibe, wende ich gerne das Prinzip „Fat -Modelle, Skinny Controller“ an. Für mich ist es für mich also keine gute Sache, den Validierungscode in den Controller zu schreiben.
Um dies zu lösen, möchte ich leidenschaftlich vorstellen, ein großartiges Paket für Laravel 4. Um präzise zu sein, präsentiert sich Leidenschaft als "selbst validierende intelligente Modelle für Laravel Framework 4s eloquentes Orm". Mit anderen Worten: Genau das, was wir brauchen!
Wie Sie sich vorstellen können, ist es im Grunde eine Erweiterung der eloquenten Modellklasse. Dieses Paket verfügt über neue Funktionen, Dienstprogramme und Methoden, die sich der Eingabevalidierung und anderen kleinen Dingen widmen.
Key Takeaways
- Verbesserte Validierung: Lerner vereinfacht den Validierungsprozess, indem Regeln direkt innerhalb des Modells definiert werden, die Organisation und Wartbarkeit verbessern, insbesondere in größeren Projekten.
- Modellautomatikhydrat: Diese Funktion füllt automatisch Modellattribute aus dem Formulareingang, reduziert den Code des Boilerplate in Controllern und macht den Codebasis sauberer und effizienter.
- Modellhaken: Ardent führt Modellhaken ein, die Methoden sind, die in bestimmten Lebenszyklusmomenten ausgeführt werden, z. vereinfachte Beziehungen: Das Definieren von Modellbeziehungen wird mit leidenschaftlicher Struktur einer einfachen Arraystruktur ($ $ relationsData`) stärker gestoppt, wodurch die Komplexität des Beziehungsmanagements in Laravel -Modellen verringert wird.
- redundante Daten automatisch läuten: Lerner kann unnötige Daten von Eingängen automatisch verwerfen, z. B. Bestätigungsfelder oder CSRF -Token, um sicherzustellen, dass nur relevante Daten verarbeitet und gespeichert werden.
- Unsere Testanwendung
Für ein besseres Verständnis der Vorteile, die Sie während der Verwendung von Leiden genießen können, werden wir eine kleine Testanwendung einrichten. Nichts Kompliziert: Eine einfache Aufgabenliste-App.
Natürlich werde ich keine vollständige Anwendung implementieren: Ich möchte nur einige Prinzipien erklären, also werde ich einige Controller und Modelle machen - keine Ansichten. Danach werde ich den Code mit Ardent "
übersetzen".Unsere Aufgabenliste zählt zwei verschiedene Entitäten:
- Benutzer
- id
- first_name
- last_name
- E -Mail
- Passwort
- Task
- id
- Name
- Status (fertig / nicht fertig)
Erstellen Sie die Migrationsdatei mit dem Befehl
php artisan migrate:make todo_setupund füllen Sie dann die Datei mit diesem Code aus:
php artisan migrate:make todo_setup
Jetzt haben wir unsere Tische. Es ist Zeit, unsere Modelle zu erstellen. Sogar hier haben wir nur sehr wenige Zeilen zu schreiben. Hier ist das Benutzermodell (das ist auch das Standard).
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Database\Schema\Blueprint</span>; </span></span><span> <span>use Illuminate<span>\Database\Migrations\Migration</span>; </span></span><span> </span><span> <span>class TodoSetup extends Migration { </span></span><span> </span><span> <span>/** </span></span><span><span> * Run the migrations. </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>public function up() </span></span><span> <span>{ </span></span><span> <span>Schema<span>::</span>create('users', function(Blueprint $table) </span></span><span> <span>{ </span></span><span> <span>$table->increments('id')->unsigned(); </span></span><span> </span><span> <span>$table->string('first_name'); </span></span><span> <span>$table->string('last_name'); </span></span><span> <span>$table->string('email'); </span></span><span> <span>$table->string('password', 60); </span></span><span> </span><span> <span>$table->timestamps(); </span></span><span> <span>}); </span></span><span> </span><span> <span>Schema<span>::</span>create('tasks', function(Blueprint $table) </span></span><span> <span>{ </span></span><span> <span>$table->increments('id'); </span></span><span> </span><span> <span>$table->string('name'); </span></span><span> <span>$table->boolean('status'); </span></span><span> </span><span> <span>$table->integer('user_id')->unsigned(); </span></span><span> </span><span> <span>$table->timestamps(); </span></span><span> </span><span> <span>$table->index('user_id'); </span></span><span> <span>}); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Reverse the migrations. </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>public function down() </span></span><span> <span>{ </span></span><span> <span>Schema<span>::</span>dropIfExists('users'); </span></span><span> <span>Schema<span>::</span>dropIfExists('tasks'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>
Ich habe gerade die Aufgabenmethode hinzugefügt, um die Beziehung zum Aufgabenmodell zu beschreiben.
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Auth\UserTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\UserInterface</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>; </span></span><span> </span><span> <span>class User extends Eloquent implements UserInterface, RemindableInterface { </span></span><span> </span><span> <span>use UserTrait, RemindableTrait; </span></span><span> </span><span> <span>/** </span></span><span><span> * The database table used by the model. </span></span><span><span> * </span></span><span><span> * <span>@var <span>string</span> </span></span></span><span><span> */ </span></span><span> <span>protected $table = 'users'; </span></span><span> </span><span> <span>/** </span></span><span><span> * The attributes excluded from the model's JSON form. </span></span><span><span> * </span></span><span><span> * <span>@var <span>array</span> </span></span></span><span><span> */ </span></span><span> <span>protected $hidden = array('password', 'remember_token'); </span></span><span> </span><span> <span>public function tasks() </span></span><span> <span>{ </span></span><span> <span>return $this->hasMany('Task'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>
Wir haben gerade unseren Ausgangspunkt gemacht. Von nun an werden wir gleich nach der Installation zwei verschiedene Situationen sehen: Erstens die „normale“ Version des Codes ohne leidenschaftlich. Gleich danach werden wir einen Vergleich mit der „verbesserten“ Version durchführen. Sie werden den Unterschied bemerken, vertrauen Sie mir.
Beginnen wir!
leidenschafts
installierenDie Installation von Ardent ist mit dem Komponisten sehr einfach. Fügen Sie einfach die Abhängigkeit zur Datei composer.json Ihres Projekts hinzu.
<span><span><?php </span></span><span> </span><span> <span>class Task extends <span>\Eloquent</span> { </span></span><span> <span>protected $fillable = []; </span></span><span> </span><span> <span>public function user() </span></span><span> <span>{ </span></span><span> <span>return $this->belongsTo('User'); </span></span><span> <span>} </span></span><span> <span>}</span></span></span>
Dann müssen Sie nach dem Update nur die leidenschaftliche Klasse in Ihren Modellen wie SO erweitern:
<span>{ </span> <span>"require": { </span> <span>"laravelbook/ardent": "2.*" </span> <span>} </span> <span>}</span>
… und du bist bereit zu gehen!
Datenvalidierung
Das erste, was zu tun ist, ist zu analysieren, wie leidenschaftlich unser Leben die Implementierung der Validierung erleichtert. Wir wissen bereits, wie man es mit Laravel macht. Erstellen wir ein klassisches Beispiel: Die Post -Methode, mit der Daten aus dem Formular eingehen.
In einer „normalen“ Situation würden wir so etwas machen:
<span><span><?php </span></span><span> <span>class User extends <span>\LaravelBook\Ardent\Ardent</span> { </span></span><span> <span>// model code here! </span></span><span> <span>}</span></span></span>… was ist mit leidenschaftlich?
Mit leidenschaftlich ändern sich die Dinge ein wenig. Wie Sie sich leicht vorstellen können, werden die Validierungsregeln direkt in das Modell verschoben: Wir werden hier unsere „Restyle“ beginnen. Öffnen Sie also die Modelldatei und ändern Sie sie so:
<span><span><?php </span></span><span> </span><span> <span>public function postSignup() </span></span><span> <span>{ </span></span><span> <span>$rules = array( </span></span><span> <span>'first_name' => 'required', </span></span><span> <span>'last_name' => 'required', </span></span><span> <span>'email' => 'required|email|unique:users', </span></span><span> <span>'password' => 'required|min:8' </span></span><span> <span>); </span></span><span> </span><span> <span>$messages = array( </span></span><span> <span>'first_name.required' => 'First name is required.', </span></span><span> <span>'last_name.required' => 'Last name is required.', </span></span><span> <span>'email.required' => 'Email is required.', </span></span><span> <span>'password.required' => 'Password is required.', </span></span><span> </span><span> <span>'email.email' => 'Use a real email address!', </span></span><span> <span>'email.unique' => 'This email address already exists!', </span></span><span> <span>'password.min' => 'Password must be at least 8 character long.' </span></span><span> <span>); </span></span><span> </span><span> <span>$validator = Validator<span>::</span>make(Input<span>::</span>all(), $rules, $messages); </span></span><span> </span><span> <span>if($validator->fails()) </span></span><span> <span>{ </span></span><span> <span>return Redirect<span>::</span>to('user/signup')->with('errors', $validator->messages()); </span></span><span> <span>} </span></span><span> </span><span> <span>$user = new User; </span></span><span> </span><span> <span>$user->first_name = Input<span>::</span>get('first_name'); </span></span><span> <span>$user->last_name = Input<span>::</span>get('last_name'); </span></span><span> <span>$user->email = Input<span>::</span>get('email'); </span></span><span> <span>$user->password = Hash<span>::</span>make(Input<span>::</span>get('password')); </span></span><span> </span><span> <span>if($user->save()) </span></span><span> <span>{ </span></span><span> <span>$status = 1; </span></span><span> <span>} </span></span><span> <span>else </span></span><span> <span>{ </span></span><span> <span>$status = 0; </span></span><span> <span>} </span></span><span> </span><span> <span>return Redirect<span>::</span>to('user/signup')->with('status', $status); </span></span><span> <span>}</span></span></span>Was ist passiert? Nicht viel: Wir haben die Basisklasse unseres Modells (von eloquent nach leidenschaftlich) geändert und haben uns die Validierungsregeln mit den benutzerdefinierten Fehlermeldungen (mit derselben Syntax, nur einer Kopie) bewegt.
.
Die Frage ist jetzt: Was werden wir in unserem Controller schreiben?schauen wir es uns an:
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Auth\UserTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\UserInterface</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>; </span></span><span> </span><span> <span>class User extends <span>\LaravelBook\Ardent\Ardent</span> implements UserInterface, RemindableInterface { </span></span><span> </span><span> <span>public static $rules = array( </span></span><span> <span>'first_name' => 'required', </span></span><span> <span>'last_name' => 'required', </span></span><span> <span>'email' => 'required|email|unique:users', </span></span><span> <span>'password' => 'required|min:8' </span></span><span> <span>); </span></span><span> </span><span> <span>public static $customMessages = array( </span></span><span> <span>'first_name.required' => 'First name is required.', </span></span><span> <span>'last_name.required' => 'Last name is required.', </span></span><span> <span>'email.required' => 'Email is required.', </span></span><span> <span>'password.required' => 'Password is required.', </span></span><span> </span><span> <span>'email.email' => 'Use a real email address!', </span></span><span> <span>'email.unique' => 'This email address already exists!', </span></span><span> <span>'password.min' => 'Password must be at least 8 character long.' </span></span><span> <span>); </span></span><span> </span><span> <span>use UserTrait, RemindableTrait; </span></span><span> </span><span> <span>/** </span></span><span><span> * The database table used by the model. </span></span><span><span> * </span></span><span><span> * <span>@var <span>string</span> </span></span></span><span><span> */ </span></span><span> <span>protected $table = 'users'; </span></span><span> </span><span> <span>/** </span></span><span><span> * The attributes excluded from the model's JSON form. </span></span><span><span> * </span></span><span><span> * <span>@var <span>array</span> </span></span></span><span><span> */ </span></span><span> <span>protected $hidden = array('password', 'remember_token'); </span></span><span> </span><span> <span>public function tasks() </span></span><span> <span>{ </span></span><span> <span>return $this->hasMany('Task'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>Keine Validierungsanweisungen mehr hier. Sie alle verschwanden. Es handelt sich jedoch nicht nur um eine „Bewegung“: Die $ user-> Save () -Methode gibt nun falsch zurück, wenn es in der Validierungsphase einige Probleme gibt. Anschließend können Sie Fehler mit der $ user-> fehler ()-> All () Methode abrufen. Keine seltsamen Klassen: Das zurückgegebene Objekt ist ein klassischer MessageBag, den Sie möglicherweise bereits bei der Arbeit mit Laravel getroffen haben.
Wenn Sie es jedoch bevorzugen, können Sie auch die Eigenschaft $ user-> validationErrors verwenden. In diesem Fall oder wenn Sie feldspezifische Fehler abrufen möchten, verwenden Sie einfach $ user-> validationErrors-> get ('field_name').
Nun ist es sehr wahrscheinlich, dass Sie denken: „OK, aber was ist der wahre Vorteil, über weniger Codezeilen?“
Beginnen wir mit den wichtigsten: Bessere Code -Organisation bedeutet eine bessere Projektwartbarkeit. In einfachen Anwendungen können Sie dies nicht als Priorität empfinden, aber wenn es um größere Projekte geht, können die Dinge mit einer einzigen falschen Entscheidung leicht durcheinander gebracht werden. Lassen Sie mich ein Beispiel für eine reale Situation machen. Wir haben unsere fantastische To-Do-List-Anwendung entwickelt und sie wächst sehr schnell. Wir brauchen definitiv eine erholsame API für die mobile Anwendung. Wenn Sie den Controller auf „normale“ Weise verwenden, bedeutet dies eine weitere Anmelderoutine für die API. Zwei verschiedene Blöcke mit dem gleichen Code! Das ist nicht gut. Wo ist das gute alte trockene Prinzip (nicht wiederholen)?
Die beste Praxis wäre also eine Anmelde () -Methode in das Modell, das alles umgeht. Die Verwendung von leidenschaftlich bedeutet wirklich alles: Von der Validierung bis zum Speichernverfahren. Ohne sie konnten wir die erste Phase nicht erreichen.
Ein zweiter Vorteil ist praktischer: Modellautomatikhydrat. Lassen Sie es uns gemeinsam entdecken.
Modell Autohydrat
unsere postsignUp () -Methode zählt genau dreizehn Codezeilen. Auch wenn es schwierig erscheint, kann Ardent diese Zahl weiter senken. Schauen Sie sich dieses Beispiel an:
php artisan migrate:make todo_setup
Keine Fehler hier. Sie verstehen wahrscheinlich schon, was passiert ist.
arrdent verfügt über eine Modell-Autohydrat-Funktion. Dies bedeutet, dass jedes Feld automatisch mit den Eingabefieldaten ausgefüllt wird, wenn Sie das Objekt erstellen und die Methode $ user-> save () aufrufen. Natürlich müssen Sie in jedem Feld entsprechend den richtigen Namen geben.
Dieser Code:
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Database\Schema\Blueprint</span>; </span></span><span> <span>use Illuminate<span>\Database\Migrations\Migration</span>; </span></span><span> </span><span> <span>class TodoSetup extends Migration { </span></span><span> </span><span> <span>/** </span></span><span><span> * Run the migrations. </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>public function up() </span></span><span> <span>{ </span></span><span> <span>Schema<span>::</span>create('users', function(Blueprint $table) </span></span><span> <span>{ </span></span><span> <span>$table->increments('id')->unsigned(); </span></span><span> </span><span> <span>$table->string('first_name'); </span></span><span> <span>$table->string('last_name'); </span></span><span> <span>$table->string('email'); </span></span><span> <span>$table->string('password', 60); </span></span><span> </span><span> <span>$table->timestamps(); </span></span><span> <span>}); </span></span><span> </span><span> <span>Schema<span>::</span>create('tasks', function(Blueprint $table) </span></span><span> <span>{ </span></span><span> <span>$table->increments('id'); </span></span><span> </span><span> <span>$table->string('name'); </span></span><span> <span>$table->boolean('status'); </span></span><span> </span><span> <span>$table->integer('user_id')->unsigned(); </span></span><span> </span><span> <span>$table->timestamps(); </span></span><span> </span><span> <span>$table->index('user_id'); </span></span><span> <span>}); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Reverse the migrations. </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>public function down() </span></span><span> <span>{ </span></span><span> <span>Schema<span>::</span>dropIfExists('users'); </span></span><span> <span>Schema<span>::</span>dropIfExists('tasks'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>
hat den gleichen Effekt wie
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Auth\UserTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\UserInterface</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>; </span></span><span> </span><span> <span>class User extends Eloquent implements UserInterface, RemindableInterface { </span></span><span> </span><span> <span>use UserTrait, RemindableTrait; </span></span><span> </span><span> <span>/** </span></span><span><span> * The database table used by the model. </span></span><span><span> * </span></span><span><span> * <span>@var <span>string</span> </span></span></span><span><span> */ </span></span><span> <span>protected $table = 'users'; </span></span><span> </span><span> <span>/** </span></span><span><span> * The attributes excluded from the model's JSON form. </span></span><span><span> * </span></span><span><span> * <span>@var <span>array</span> </span></span></span><span><span> */ </span></span><span> <span>protected $hidden = array('password', 'remember_token'); </span></span><span> </span><span> <span>public function tasks() </span></span><span> <span>{ </span></span><span> <span>return $this->hasMany('Task'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>
Von dreiTheenen sind wir gerade für ein ganzes Anmeldeverfahren auf sieben gegangen.
Um diese Funktion zu verwenden, müssen Sie sie aktivieren. Wechseln Sie einfach den $ AutohydrateEntityFrominput in Ihrem Modell auf wahr, wie folgt:
<span><span><?php </span></span><span> </span><span> <span>class Task extends <span>\Eloquent</span> { </span></span><span> <span>protected $fillable = []; </span></span><span> </span><span> <span>public function user() </span></span><span> <span>{ </span></span><span> <span>return $this->belongsTo('User'); </span></span><span> <span>} </span></span><span> <span>}</span></span></span>
fertig!
Sie haben auch oft einige redundante Daten, die Sie für die Geschäftslogik nicht benötigen. Denken Sie an _ Confirmationsfelder oder die CSRF -Token. Nun, wir können sie mit dem $ autopurgeredundantattributes -Eigentum des Modells verwerfen. Schalten Sie es nach wie vor auf true.
<span>{ </span> <span>"require": { </span> <span>"laravelbook/ardent": "2.*" </span> <span>} </span> <span>}</span>
Jetzt ist die Prozedur sauberer als zuvor.
Modellhaken
Ein weiteres, erwähnenswertes Merkmal ist die Einführung von Modellhaken. Sie sind im Wesentlichen eine Liste von Methoden, die, wenn sie implementiert werden, in bestimmten Ausführungsmomenten aufgerufen werden. Um ein Beispiel zu erstellen, wird die Methode AfterUpdate () vor jedem Update () -Anruf aufgerufen. Die Methode vorbevalidat () wird vor jeder Validierung aufgerufen, usw.
Hier ist eine Liste all dieser Methoden:
- Berecreate ()
- Aftercreate ()
- Beforesave ()
- AfterSave ()
- vorupdate ()
- AfterUpdate ()
- beorteelete ()
- AfterDelete ()
- vorValidate ()
- Aftervalidat ()
Ein klassisches Beispiel könnte eine Datenausarbeitung vor dem Speicherverfahren sein. So wie folgt:
php artisan migrate:make todo_setup
Jede "Vorher" -Methode hat einen booleschen Rückgabewert. Wenn wahr, wird die folgende Operation normal ausgeführt. Wenn die Methode false zurückgibt, wird die Operation gestoppt. In der obigen Methode haben wir eine Schnecke (und füllten das richtige Feld) mit der Methode Beforesave () direkt nach der Validierung erzeugt.
Es gibt auch einen bestimmten Tipp über Beforesave () und Aftersave (): Sie können sie zur Laufzeit deklarieren. Schauen Sie:
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Database\Schema\Blueprint</span>; </span></span><span> <span>use Illuminate<span>\Database\Migrations\Migration</span>; </span></span><span> </span><span> <span>class TodoSetup extends Migration { </span></span><span> </span><span> <span>/** </span></span><span><span> * Run the migrations. </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>public function up() </span></span><span> <span>{ </span></span><span> <span>Schema<span>::</span>create('users', function(Blueprint $table) </span></span><span> <span>{ </span></span><span> <span>$table->increments('id')->unsigned(); </span></span><span> </span><span> <span>$table->string('first_name'); </span></span><span> <span>$table->string('last_name'); </span></span><span> <span>$table->string('email'); </span></span><span> <span>$table->string('password', 60); </span></span><span> </span><span> <span>$table->timestamps(); </span></span><span> <span>}); </span></span><span> </span><span> <span>Schema<span>::</span>create('tasks', function(Blueprint $table) </span></span><span> <span>{ </span></span><span> <span>$table->increments('id'); </span></span><span> </span><span> <span>$table->string('name'); </span></span><span> <span>$table->boolean('status'); </span></span><span> </span><span> <span>$table->integer('user_id')->unsigned(); </span></span><span> </span><span> <span>$table->timestamps(); </span></span><span> </span><span> <span>$table->index('user_id'); </span></span><span> <span>}); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Reverse the migrations. </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>public function down() </span></span><span> <span>{ </span></span><span> <span>Schema<span>::</span>dropIfExists('users'); </span></span><span> <span>Schema<span>::</span>dropIfExists('tasks'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>
Überlegen wir uns über einige mögliche Verwendungen dieser Methoden in unserer Anwendung.
Vielleicht ein Beforesave (), um mit Passwort zu handeln?
<span><span><?php </span></span><span> </span><span> <span>use Illuminate<span>\Auth\UserTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\UserInterface</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>; </span></span><span> <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>; </span></span><span> </span><span> <span>class User extends Eloquent implements UserInterface, RemindableInterface { </span></span><span> </span><span> <span>use UserTrait, RemindableTrait; </span></span><span> </span><span> <span>/** </span></span><span><span> * The database table used by the model. </span></span><span><span> * </span></span><span><span> * <span>@var <span>string</span> </span></span></span><span><span> */ </span></span><span> <span>protected $table = 'users'; </span></span><span> </span><span> <span>/** </span></span><span><span> * The attributes excluded from the model's JSON form. </span></span><span><span> * </span></span><span><span> * <span>@var <span>array</span> </span></span></span><span><span> */ </span></span><span> <span>protected $hidden = array('password', 'remember_token'); </span></span><span> </span><span> <span>public function tasks() </span></span><span> <span>{ </span></span><span> <span>return $this->hasMany('Task'); </span></span><span> <span>} </span></span><span> </span><span> <span>}</span></span></span>
oder ein Reinigungshaken kurz vor der Löschung der Benutzer?
<span><span><?php </span></span><span> </span><span> <span>class Task extends <span>\Eloquent</span> { </span></span><span> <span>protected $fillable = []; </span></span><span> </span><span> <span>public function user() </span></span><span> <span>{ </span></span><span> <span>return $this->belongsTo('User'); </span></span><span> <span>} </span></span><span> <span>}</span></span></span>
Es gibt viele Möglichkeiten.
Beziehungen definieren (der leidenschaftliche Weg)
Mit leidenschaftlich können Sie auch Beziehungen auf kürzere Weise definieren als zuvor. Lassen Sie uns sehen, wie wir unsere Beziehungen zwischen Modellen tatsächlich definieren: Das folgende Beispiel zeigt die Methode der Aufgaben () im Benutzermodell.
<span>{ </span> <span>"require": { </span> <span>"laravelbook/ardent": "2.*" </span> <span>} </span> <span>}</span>
Verwenden von Ardent zum Definieren von Beziehungen bedeutet, ein einfaches Array zu definieren, das als $ relationsData bezeichnet wird.
<span><span><?php </span></span><span> <span>class User extends <span>\LaravelBook\Ardent\Ardent</span> { </span></span><span> <span>// model code here! </span></span><span> <span>}</span></span></span>
Dies hat genau den gleichen Effekt. Leiden verwendet die gleiche Namenskonvention, um Namen und Methoden zu binden, ohne sie einzeln schreiben zu müssen.
Es gibt jedoch viele Anpassungen, die Sie durchführen können:
<span><span><?php </span></span><span> </span><span> <span>public function postSignup() </span></span><span> <span>{ </span></span><span> <span>$rules = array( </span></span><span> <span>'first_name' => 'required', </span></span><span> <span>'last_name' => 'required', </span></span><span> <span>'email' => 'required|email|unique:users', </span></span><span> <span>'password' => 'required|min:8' </span></span><span> <span>); </span></span><span> </span><span> <span>$messages = array( </span></span><span> <span>'first_name.required' => 'First name is required.', </span></span><span> <span>'last_name.required' => 'Last name is required.', </span></span><span> <span>'email.required' => 'Email is required.', </span></span><span> <span>'password.required' => 'Password is required.', </span></span><span> </span><span> <span>'email.email' => 'Use a real email address!', </span></span><span> <span>'email.unique' => 'This email address already exists!', </span></span><span> <span>'password.min' => 'Password must be at least 8 character long.' </span></span><span> <span>); </span></span><span> </span><span> <span>$validator = Validator<span>::</span>make(Input<span>::</span>all(), $rules, $messages); </span></span><span> </span><span> <span>if($validator->fails()) </span></span><span> <span>{ </span></span><span> <span>return Redirect<span>::</span>to('user/signup')->with('errors', $validator->messages()); </span></span><span> <span>} </span></span><span> </span><span> <span>$user = new User; </span></span><span> </span><span> <span>$user->first_name = Input<span>::</span>get('first_name'); </span></span><span> <span>$user->last_name = Input<span>::</span>get('last_name'); </span></span><span> <span>$user->email = Input<span>::</span>get('email'); </span></span><span> <span>$user->password = Hash<span>::</span>make(Input<span>::</span>get('password')); </span></span><span> </span><span> <span>if($user->save()) </span></span><span> <span>{ </span></span><span> <span>$status = 1; </span></span><span> <span>} </span></span><span> <span>else </span></span><span> <span>{ </span></span><span> <span>$status = 0; </span></span><span> <span>} </span></span><span> </span><span> <span>return Redirect<span>::</span>to('user/signup')->with('status', $status); </span></span><span> <span>}</span></span></span>
Jedes Element in $ relationsData hat einen Schlüssel (ja, den Methodennamen der Beziehung) und ein Array mit einigen Parametern.
- Der erste Parameter (ohne Schlüssel, es ist nur der erste) beschreibt den Beziehungstyp (Hasone, Hasmany, gehört Der zweite Parameter (ohne Schlüssel, es ist nur das zweite) definiert das Zielmodell der aktuellen Beziehung;
- Weitere Parameter haben keine bestimmte Position, sondern einen Schlüssel. Sie könnten:
- sein
- ForeignKey: Optional, verwendet für Hasone, Hasmany, hingohrsto und
- Tabelle, andere Key, Zeitstempel und Pivotkeys: Optional, für die Hingehörigkeit verwendet;
- Name, Typ und ID: Verwendet mit Morphto, Morphone und Morpany;
Schlussfolgerung
Mit einem großen Paket von Vorteilen (auch 126.000 Downloads und häufige Updates) ist es sehr schwierig, einen Grund zu finden, in Ihrer nächsten App keine Ardentität zu verwenden. Es ist für jede Art von Projekt geeignet und eine Erweiterung des Modells von Eloquent ist die vollständige Kompatibilität mit Laravel -Projekten.
Ich empfehle es auf jeden Fall. Tust du? Hast du es ausprobiert? Lassen Sie uns in den Kommentaren unten wissen!
häufig gestellte Fragen (FAQs) zu Laravel -Modellen
Was sind die wichtigsten Unterschiede zwischen Laravel 4.2, 5.0, 7.x und 10.x eloquent? In Laravel 4.2 war eloquent ein einfaches ORM (Objektrelationskartierung) mit grundlegenden CRUD-Operationen. Laravel 5.0 führte neue Funktionen wie mehrere Verbindungen, Soft -Delets und Event -Handhabung ein. Laravel 7.x brachte eifrige Belastung, Modellserialisierung und API -Ressourcen ein. Laravel 10.x hat die eloquent noch verbesserte Leistung, bessere Fehlerbehandlung und erweiterte Funktionen wie Batch -Operationen und Modellfabriken verbessert. Fügt Laravel ein selbstvalidierendes intelligentes eloquentes Modell hinzu. Es bietet eine automatische Validierung von Attributen, bevor sie gespeichert werden, wodurch die Menge an Validierungscode reduziert wird, die Sie in Ihren Controllern schreiben müssen. Ardent unterstützt auch eine verschachtelte Transaktionssicherheit von Modellen und ihre Beziehungen, wodurch komplexe Speichervorgänge vereinfacht werden. Datenbankverbindungen, indem Sie diese in Ihrer Datei config/Database.php definieren. In Ihrem beredten Modell können Sie dann angeben, welche Verbindung mit der $ Connection -Eigenschaft verwendet werden soll. Zum Beispiel protected $ connection = 'MySQL2'; Würde die Verbindung "MySQL2" verwenden. Dies kann die Leistung bei der Arbeit mit großen Datensätzen erheblich verbessern. Sie können die Methode mit () in eloquent verwenden, um anzugeben, welche Beziehungen zu eifrig belastet sind. 'Ein Datensatz, ohne sie tatsächlich aus der Datenbank zu entfernen. Stattdessen wird ein Zeitstempel deleted_at festgelegt. Sie können weiche Deletten in einem eloquenten Modell aktivieren, indem Sie das Merkmal von SoftDeletes verwenden und Ihrer Tabelle eine Deleted_at -Spalte hinzufügen. Bequeme Möglichkeit, neue Modellinstanzen zum Testen oder Aussaat Ihrer Datenbank zu generieren. Sie können eine Modellfabrik definieren, die die Standardattributwerte für Ihr Modell angibt, und dann die Fabrik zum Erstellen neuer Instanzen mit diesen Standardeinstellungen verwenden. > Ardent bietet eine SaveNested () -Methode, mit der ein Modell und alle zugehörigen Modelle in einer einzelnen Datenbank -Transaktion gespeichert werden. Dies stellt sicher, dass entweder alle Saves erfolgreich sind oder keine tun, um die Integrität Ihrer Daten aufrechtzuerhalten.
Wie verwende ich API -Ressourcen in Laravel eloquent? Sie können eine Ressourcenklasse erstellen, die definiert, wie das Modell transformiert werden soll, und dann Instanzen dieser Ressourcenklasse aus Ihren API -Routen zurückgeben. Die Attribute des Modells gegen eine Reihe von Regeln, die vor dem Speichern im Modell definiert sind. Wenn die Validierung fehlschlägt, wird der Speichervorgang abgebrochen und die Validierungsfehler sind über die METHOR () ()
Was ist der Zweck der BOOT () -Methode in Laravel eloquent? () Methode in Laravel Eloquent ist ein Lebenszyklushaken, der aufgerufen wird, wenn das Modell „gestoot“ ist, d. H. In den Speicher geladen wird. Sie können diese Methode in Ihrem Modell überschreiben, um ein Verhalten hinzuzufügen, das auftreten sollte, wenn das Modell gestartet wird, z. B. die Registrierung von Ereignishörern oder das Anpassen der Konfiguration des Modells.
Das obige ist der detaillierte Inhalt vonLaSent: Laravel -Modelle auf Steroiden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

PHP bleibt im Modernisierungsprozess wichtig, da es eine große Anzahl von Websites und Anwendungen unterstützt und sich den Entwicklungsbedürfnissen durch Frameworks anpasst. 1.PHP7 verbessert die Leistung und führt neue Funktionen ein. 2. Moderne Frameworks wie Laravel, Symfony und Codesigniter vereinfachen die Entwicklung und verbessern die Codequalität. 3.. Leistungsoptimierung und Best Practices verbessern die Anwendungseffizienz weiter.

PhPhas significantantyPactedWebDevelopmentAndendendsbeyondit.1) iTpowersMAjorPlatforms-LikewordpressandExcelsInDatabaseInteractions.2) php'SadaptabilityAllowStoscaleForLargeApplicationsfraMe-Linien-Linien-Linien-Linienkripte

PHP -Typ -Eingabeaufforderungen zur Verbesserung der Codequalität und der Lesbarkeit. 1) Tipps zum Skalartyp: Da Php7.0 in den Funktionsparametern wie int, float usw. angegeben werden dürfen. 3) Eingabeaufforderung für Gewerkschaftstyp: Da Php8.0 in Funktionsparametern oder Rückgabetypen angegeben werden dürfen. 4) Nullierstyp Eingabeaufforderung: Ermöglicht die Einbeziehung von Nullwerten und Handlungsfunktionen, die Nullwerte zurückgeben können.

Verwenden Sie in PHP das Klonschlüsselwort, um eine Kopie des Objekts zu erstellen und das Klonierungsverhalten über die \ _ \ _ Clone Magic -Methode anzupassen. 1. Verwenden Sie das Klonschlüsselwort, um eine flache Kopie zu erstellen und die Eigenschaften des Objekts, nicht die Eigenschaften des Objekts zu klonen. 2. Die \ _ \ _ Klonmethode kann verschachtelte Objekte tief kopieren, um flache Kopierprobleme zu vermeiden. 3. achten Sie darauf, dass kreisförmige Referenzen und Leistungsprobleme beim Klonen vermieden werden, und optimieren Sie die Klonierungsvorgänge, um die Effizienz zu verbessern.

PHP eignet sich für Webentwicklungs- und Content -Management -Systeme, und Python eignet sich für Datenwissenschafts-, maschinelles Lernen- und Automatisierungsskripte. 1.PHP hat eine gute Leistung beim Erstellen von schnellen und skalierbaren Websites und Anwendungen und wird üblicherweise in CMS wie WordPress verwendet. 2. Python hat sich in den Bereichen Datenwissenschaft und maschinelles Lernen mit reichen Bibliotheken wie Numpy und TensorFlow übertrifft.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor