Heim > PHP-Framework > Laravel > Hauptteil

Schnellstart mit Laravel Model Events

Guanhui
Freigeben: 2020-05-01 13:07:10
nach vorne
2507 Leute haben es durchsucht

Mit Laravel-Modellereignissen können Sie mehrere wichtige Punkte im Modelllebenszyklus überwachen und sogar verhindern, dass ein Modell gespeichert oder gelöscht wird. Die Laravel Model Events-Dokumentation bietet einen Überblick darüber, wie Hooks verwendet werden, um entsprechende Ereignisse mit verwandten Ereignistypen zu verknüpfen. Der Schwerpunkt dieses Artikels liegt jedoch auf der Konstruktion und Einrichtung von Ereignissen und Listenern sowie einigen zusätzlichen Details.

Event-Übersicht

Eloquent verfügt über viele Events, die Sie mithilfe von Hooks verbinden und Ihren Modellen benutzerdefinierte Funktionen hinzufügen können. Das Modell beginnt mit den folgenden Ereignissen:

abgerufen

erstellen

erstellt

aktualisieren

aktualisiert

speichern

gespeichert

löschen

gelöscht

wiederherstellen

wiederhergestellt

Aus der Dokumentation können wir mehr über sie alle erfahren Wie wird es implementiert? Sie können auch in die Basisklasse von Model gehen, um zu sehen, wie sie implementiert sind:

Wenn das vorhandene Modell aus der Datenbank abgerufen wird, wird das abgerufene Ereignis ausgelöst. Wenn ein neues Modell zum ersten Mal gespeichert wird, werden die Ereignisse „Creating“ und „Created“ ausgelöst. Wenn die Methode save für ein Modell aufgerufen wird, das bereits in der Datenbank vorhanden ist, wird das Aktualisierungs-/Aktualisierungsereignis ausgelöst. Unabhängig davon werden in beiden Fällen die Speicher-/gespeicherten Ereignisse ausgelöst.

Das Dokument gibt einen guten Überblick über Modellereignisse und erklärt, wie man Hooks verwendet, um Ereignisse zuzuordnen. Wenn Sie jedoch ein Anfänger sind oder nicht mit der Verwendung von Hooks vertraut sind, um Ereignis-Listener mit diesen Anpassungen zu verbinden, sind Modellereignisse dies Damit verbunden, lesen Sie bitte weiter in diesem Artikel.

Ereignisse registrieren

Um ein Ereignis mit Ihrem Modell zu verknüpfen, müssen Sie zunächst das Ereignisobjekt mithilfe der Eigenschaft $dispatchesEvents registrieren, was letztendlich der Fall sein wird ausgelöst durch die Methode HasEvents::fireCustomModelEvent(), die von der Methode fireModelEvent() aufgerufen wird. Die fireCustomModelEvent()-Methode sah ursprünglich so aus:

/**
 * 为给定的事件触发一个自定义模型。
 *
 * @param  string  $event
 * @param  string  $method
 * @return mixed|null
 */
protected function fireCustomModelEvent($event, $method)
{
    if (! isset($this->dispatchesEvents[$event])) {
        return;
    }
    $result = static::$dispatcher->$method(new $this->dispatchesEvents[$event]($this));
    if (! is_null($result)) {
        return $result;
    }
}
Nach dem Login kopieren

Einige Ereignisse, z. B. Löschen, werden erkannt, um zu bestimmen, ob das Ereignis „false“ zurückgibt, und dann den Vorgang zu beenden. Mit diesem Hook können Sie beispielsweise eine Erkennung durchführen und verhindern, dass ein Benutzer erstellt oder gelöscht wird.

Wenn Sie beispielsweise das AppUser-Modell verwenden, können Sie Ihr Modellereignis wie folgt konfigurieren:

protected $dispatchesEvents = [
    'saving' => \App\Events\UserSaving::class,
];
Nach dem Login kopieren

Sie können den Befehl artisan make:event verwenden, um dieses Ereignis für Sie zu erstellen, aber im Grunde wird es so sein Ihr Das Endergebnis ist:

<?php
namespace App\Events;
use App\User;
use Illuminate\Queue\SerializesModels;
class UserSaving
{
    use SerializesModels;
    public $user;
    /**
     *  创建一个新的事件实例
     *
     * @param \App\User $user
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}
Nach dem Login kopieren

Unser Ereignis stellt eine öffentliche $user-Eigenschaft bereit, damit Sie während des Speicherereignisses auf die Benutzermodellinstanz zugreifen können.

Damit es funktioniert, müssen Sie als Nächstes einen tatsächlichen Listener für dieses Ereignis einrichten. Wir legen die Auslösezeit des Modells fest. Wenn das Benutzermodell das Speicherereignis auslöst, wird der Listener aufgerufen.

Erstellen Sie einen Ereignis-Listener

Jetzt definieren wir das Benutzermodell und registrieren einen Ereignis-Listener, der darauf wartet, dass das Speicherereignis ausgelöst wird. Obwohl mir dies mit Modellbeobachtern schnell gelungen ist, möchte ich Sie durch die Konfiguration von Ereignis-Listenern für einzelne Ereignisauslöser führen.

Ereignis-Listener sind genau wie andere Ereignis-Listener in Laravel. Die Methode handle() empfängt eine Instanz der Ereignisklasse AppEventsUserSaving.

Sie können es manuell erstellen oder den PHP-Artisan-Befehl make:listener verwenden. Unabhängig davon erstellen Sie eine Listener-Klasse wie folgt:

<?php
namespace App\Listeners;
use App\Events\UserSaving as UserSavingEvent;
class UserSaving
{
    /**
     * 处理事件。
     *
     * @param  \App\Events\UserSavingEvent $event
     * @return mixed
     */
    public function handle(UserSavingEvent $event)
    {
        app(&#39;log&#39;)->info($event->user);
    }
}
Nach dem Login kopieren

Ich habe gerade einen Protokollierungsaufruf hinzugefügt, um die Überprüfung des an den Listener übergebenen Modells zu erleichtern. Dazu müssen wir auch einen Listener im EventServiceProvider::$listen-Attribut registrieren:

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
    /**
     * 应用的事件监听器。
     * 
     * @var array
     */
    protected $listen = [
        \App\Events\UserSaving::class => [
            \App\Listeners\UserSaving::class,
        ],
    ];
    // ...
}
Nach dem Login kopieren

Wenn das Modell nun das Speicherereignis aufruft, wird auch der von uns registrierte Ereignis-Listener ausgelöst und ausgeführt.

Versuchen Sie die Ereignisüberwachung

Wir können über die Tinker-Sitzung schnell Ereignisüberwachungscode generieren:

php artisan tinker
>>> factory(\App\User::class)->create();
=> App\User {#794
     name: "Aiden Cremin",
     email: "josie05@example.com",
     updated_at: "2018-03-15 03:57:18",
     created_at: "2018-03-15 03:57:18",
     id: 2,
   }
Nach dem Login kopieren

Wenn Sie das Ereignis und den Listener korrekt registriert haben, Sie sollten den JSON-Ausdruck des Modells in der Datei laravel.log sehen:

[2018-03-15 03:57:18] local.INFO: {"name":"Aiden Cremin","email":"josie05@example.com"}
Nach dem Login kopieren

Zu beachten ist, dass das Modell derzeit nicht über die Attribute „created_at“ oder „update_at“ verfügt. Wenn save() im Modell erneut aufgerufen wird, wird im Protokoll ein neuer Datensatz mit einem Zeitstempel angezeigt, da das Speicherereignis für neu erstellte oder vorhandene Datensätze ausgelöst wird:

>>> $u = factory(\App\User::class)->create();
=> App\User {#741
     name: "Eloisa Hirthe",
     email: "gottlieb.itzel@example.com",
     updated_at: "2018-03-15 03:59:37",
     created_at: "2018-03-15 03:59:37",
     id: 3,
   }
>>> $u->save();
=> true
>>>
Nach dem Login kopieren

Speichern stoppen Operation

Einige Modellereignisse ermöglichen die Durchführung von Blockierungsvorgängen. Um ein lächerliches Beispiel zu nennen: Angenommen, wir erlauben keinem Benutzermodell, sein Attribut $user->name zu speichern. Der Inhalt lautet Paul:

/**
 * 处理事件。
 *
 * @param  \App\Events\UserSaving $event
 * @return mixed
 */
public function handle(UserSaving $event)
{
    if (stripos($event->user->name, &#39;paul&#39;) !== false) {
        return false;
    }
}
Nach dem Login kopieren

In der Model::save()-Methode von Eloquent Basierend auf dem Rückgabeergebnis der Ereignisüberwachung wird bestimmt, ob das Speichern gestoppt werden soll:

public function save(array $options = [])
{
    $query = $this->newQueryWithoutScopes();
    // 如果 "saving" 事件返回 false ,我们将退出保存并返回
    // false,表示保存失败。这为服务监听者提供了一个机会,
    // 当验证失败或者出现其它任何情况,都可以取消保存操作。
    if ($this->fireModelEvent(&#39;saving&#39;) === false) {
        return false;
    }
Nach dem Login kopieren

Dieses save() ist ein gutes Beispiel. Es zeigt Ihnen, wie Sie Ereignisse im Modelllebenszyklus anpassen und die Protokolldatenaufzeichnung passiv durchführen oder Aufgabenplanung.

Beobachter verwenden

Wenn Sie mehrere Ereignisse abhören, ist es möglicherweise bequemer, eine Beobachterklasse zu verwenden, um Ereignisse nach Typ gruppiert zu speichern. Hier ist ein Beispiel für einen Eloquent Observer:

<?php
namespace App\Observers;
use App\User;
class UserObserver
{
    /**
     * 监听 User 创建事件。
     *
     * @param  \App\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }
    /**
     * 监听 User 删除事件。
     *
     * @param  \App\User  $user
     * @return void
     */
    public function deleting(User $user)
    {
        //
    }
}
Nach dem Login kopieren

Sie können einen Beobachter in der boot()-Methode des Dienstanbieters AppServiceProvider registrieren.

/**
 * 运行所有应用服务。
 *
 * @return void
 */
public function boot()
{
    User::observe(UserObserver::class);
}
Nach dem Login kopieren

推荐教程:《Laravel教程

Das obige ist der detaillierte Inhalt vonSchnellstart mit Laravel Model Events. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage