Heim PHP-Framework Laravel Schnellstart mit Laravel Model Events

Schnellstart mit Laravel Model Events

May 01, 2020 pm 01:07 PM
laravel

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Apr 01, 2025 pm 02:45 PM

Methode zum Abholen des Rücksendecode, wenn das Senden von Laravel -E -Mails fehlschlägt. Wenn Sie Laravel zur Entwicklung von Anwendungen verwenden, stellen Sie häufig Situationen auf, in denen Sie Überprüfungscodes senden müssen. Und in Wirklichkeit ...

Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Mar 31, 2025 pm 11:24 PM

Laravel -Zeitplan -Aufgabe Ausführen nicht reagierende Fehlerbehebung Bei Verwendung der Zeitplanung von Laravel -Zeitplänen werden viele Entwickler auf dieses Problem stoßen: Zeitplan: Run ...

Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Mar 31, 2025 pm 11:48 PM

Die Methode zum Umgang mit Laravels E -Mail -Versagen zum Senden von Verifizierungscode besteht darin, Laravel zu verwenden ...

So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? Apr 01, 2025 am 07:09 AM

So implementieren Sie die Tabellenfunktion von benutzerdefiniertem Klicken, um Daten in dcatadmin (laravel-admin) hinzuzufügen, wenn Sie DCAT verwenden ...

Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Apr 01, 2025 am 07:45 AM

Die Auswirkungen des Austauschs von Redis -Verbindungen im Laravel -Framework und der Auswahl von Methoden bei Verwendung von Laravel -Framework und Redis können Entwickler auf ein Problem stoßen: Durch Konfiguration ...

Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Apr 01, 2025 am 09:09 AM

Benutzerdefinierte Mieterdatenbankverbindung in Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis beim Erstellen von Multi-Mandanten-Anwendungen mit Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis, ...

Laravel eloquent orm bei bangla partieller Modellsuche) Laravel eloquent orm bei bangla partieller Modellsuche) Apr 08, 2025 pm 02:06 PM

Laraveleloquent-Modellab Abruf: Das Erhalten von Datenbankdaten Eloquentorm bietet eine prägnante und leicht verständliche Möglichkeit, die Datenbank zu bedienen. In diesem Artikel werden verschiedene eloquente Modellsuchtechniken im Detail eingeführt, um Daten aus der Datenbank effizient zu erhalten. 1. Holen Sie sich alle Aufzeichnungen. Verwenden Sie die Methode All (), um alle Datensätze in der Datenbanktabelle zu erhalten: UseApp \ Models \ post; $ posts = post :: all (); Dies wird eine Sammlung zurückgeben. Sie können mit der Foreach-Schleife oder anderen Sammelmethoden auf Daten zugreifen: foreach ($ postas $ post) {echo $ post->

Laravels Geospatial: Optimierung interaktiver Karten und großen Datenmengen Laravels Geospatial: Optimierung interaktiver Karten und großen Datenmengen Apr 08, 2025 pm 12:24 PM

Verarbeiten Sie 7 Millionen Aufzeichnungen effizient und erstellen Sie interaktive Karten mit Geospatial -Technologie. In diesem Artikel wird untersucht, wie über 7 Millionen Datensätze mithilfe von Laravel und MySQL effizient verarbeitet und in interaktive Kartenvisualisierungen umgewandelt werden können. Erstes Herausforderungsprojektanforderungen: Mit 7 Millionen Datensätzen in der MySQL -Datenbank wertvolle Erkenntnisse extrahieren. Viele Menschen erwägen zunächst Programmiersprachen, aber ignorieren die Datenbank selbst: Kann sie den Anforderungen erfüllen? Ist Datenmigration oder strukturelle Anpassung erforderlich? Kann MySQL einer so großen Datenbelastung standhalten? Voranalyse: Schlüsselfilter und Eigenschaften müssen identifiziert werden. Nach der Analyse wurde festgestellt, dass nur wenige Attribute mit der Lösung zusammenhängen. Wir haben die Machbarkeit des Filters überprüft und einige Einschränkungen festgelegt, um die Suche zu optimieren. Kartensuche basierend auf der Stadt

See all articles