Heim > Backend-Entwicklung > PHP-Tutorial > LaSent: Laravel -Modelle auf Steroiden

LaSent: Laravel -Modelle auf Steroiden

William Shakespeare
Freigeben: 2025-02-19 09:07:12
Original
227 Leute haben es durchsucht

Ardent: Laravel Models on Steroids

LaSent: Laravel -Modelle auf Steroiden

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)
Ein wirklich grundlegendes Projekt. Wenn Sie jedoch keinen Code schreiben möchten, machen Sie sich keine Sorgen: Ich habe bereits eine Migration vorbereitet, mit der Sie die Datenbank generieren können. Benutze es!

Erstellen Sie die Migrationsdatei mit dem Befehl

php artisan migrate:make todo_setup
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
und füllen Sie dann die Datei mit diesem Code aus:

php artisan migrate:make todo_setup
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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

installieren

Die 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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

… 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>
Nach dem Login kopieren
Nach dem Login kopieren
… 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>
Nach dem Login kopieren
Nach dem Login kopieren
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>
Nach dem Login kopieren
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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Ü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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage