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; } }
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, ];
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; } }
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('log')->info($event->user); } }
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, ], ]; // ... }
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, }
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"}
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 >>>
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, 'paul') !== false) { return false; } }
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('saving') === false) { return false; }
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) { // } }
Sie können einen Beobachter in der boot()-Methode des Dienstanbieters AppServiceProvider registrieren.
/** * 运行所有应用服务。 * * @return void */ public function boot() { User::observe(UserObserver::class); }
推荐教程:《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!