国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Inhaltsverzeichnis
Was sind Ereignisse und Zuh?rer?
#event
#create Ereignisklasse
#create louser
Verwenden Sie den Beobachter, um auf Modellereignisse zu h?ren
Vorsichtsma?nahmen bei der Verwendung von Modellereignissen
Alternative Methoden zur Betrachtung
Vor- und Nachteile der Verwendung von Modellereignissen
#Pros
#disadVantages
Schlussfolgerung
Heim Backend-Entwicklung PHP-Tutorial Ein Leitfaden zu Laravels Modellereignissen

Ein Leitfaden zu Laravels Modellereignissen

Mar 06, 2025 am 02:25 AM

A guide to Laravel's model events

Die Modellereignisse von

Laravel sind eine sehr bequeme Funktion, mit der Sie bei der Durchführung bestimmter Vorg?nge auf Ihrem beredten Modell automatisch Logik ausführen k?nnen. Wenn dies jedoch nicht ordnungsgem?? verwendet wird, kann dies manchmal zu seltsamen Nebenwirkungen führen.

In diesem Artikel wird untersucht, welche Modellereignisse sie sind und wie sie in Laravel -Anwendungen verwendet werden. Wir werden auch untersuchen, wie Sie Modellereignisse und einige Probleme testen, die Sie bei der Verwendung bewusst sind. Schlie?lich werden wir einige Alternativen zu Modellereignissen abdecken, die Sie in Betracht ziehen k?nnen.

Was sind Ereignisse und Zuh?rer?


Sie haben vielleicht von "Ereignissen" und "Zuh?rern" geh?rt. Aber wenn Sie noch nicht davon geh?rt haben, finden Sie hier einen kurzen überblick darüber:

#event

Dies ist das, was in den Apps passiert, auf die Sie reagieren m?chten - beispielsweise haben Benutzer sich auf Ihrer Website anmelden, Benutzer melden sich an usw.

In Laravel sind Ereignisse normalerweise PHP -Klassen. Zus?tzlich zu den Ereignissen, die von Frameworks oder Drittanbieterpaketen bereitgestellt werden, werden sie normalerweise im Verzeichnis app/Events gespeichert.

Folgendes ist ein Beispiel für eine einfache Ereignisklasse, die Sie m?glicherweise planen m?chten, wenn ein Benutzer auf Ihre Website registriert:

declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

Im obigen grundlegenden Beispiel haben wir eine AppEventsUserRegistered Ereignisklasse, die eine User -Modellinstanz in seinem Konstruktor akzeptiert. Diese Ereignisklasse ist ein einfacher Container zum Speichern registrierter Benutzerinstanzen.

Beim Versand ausl?st das Ereignis jeden H?rer, der es h?rt.

Folgendes ist ein einfaches Beispiel für die Planung des Ereignisses, wenn ein Benutzer registriert:

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);
Im obigen Beispiel erstellen wir einen neuen Benutzer und planen dann das Ereignis

mit der Benutzerinstanz. Angenommen, der H?rer ist korrekt registriert, l?st dies jeden H?rer aus, der das Ereignis AppEventsUserRegistered h?rt. AppEventsUserRegistered

#Listener

H?rer sind Codebl?cke, die Sie ausführen m?chten, wenn ein bestimmtes Ereignis auftritt.

Bleiben Sie beispielsweise bei unserem Benutzerregistrierungsbeispiel. M?glicherweise m?chten Sie eine willkommene E -Mail an den Benutzer senden, wenn sich der Benutzer registriert. Sie k?nnen einen H?rer für die

-Veranstaltung erstellen und eine willkommene E -Mail senden. AppEventsUserRegistered

In Laravel sind die Zuh?rer normalerweise (aber nicht immer) Klassen im Verzeichnis

. app/Listeners

Beispiel dafür, dass der H?rer eine willkommene E -Mail an einen Benutzer sendet, wenn ein Benutzerregister so aussieht:

declare(strict_types=1);

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Mail;

final readonly class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        $event->user->notify(new WelcomeNotification());
    }
}
Wie wir im obigen Codebeispiel gesehen haben, hat die

-Listener -Klasse eine AppListenersSendWelcomeEmail -Methode, die eine handle -Ereigungsinstanz akzeptiert. Diese Methode ist für das Senden einer willkommenen E -Mail an den Benutzer verantwortlich. AppEventsUserRegistered

Für eingehende Anweisungen zu Ereignissen und H?rern m?chten Sie sich m?glicherweise die offizielle Dokumentation ansehen: http://www.miracleart.cn/link/d9a8c56824cfbe6f28f85edbbe83E09

Was ist ein Modellereignis?

In Ihrer Laravel -Anwendung müssen Sie in der Regel Ereignisse manuell planen, wenn bestimmte Aktionen auftreten. Wie wir im obigen Beispiel gesehen haben, k?nnen wir Ereignisse mit dem folgenden Code planen:
declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

Bei Verwendung des beredten Modells in Laravel sind einige Ereignisse für uns automatisch geplant, sodass wir sie nicht manuell planen müssen. Wenn wir bei Ereignissen Operationen ausführen m?chten, müssen wir nur die Zuh?rer für sie definieren.

Die folgende Liste zeigt Ereignisse und Ausl?ser, die automatisch vom eloquenten Modell geplant sind:
  • abgerufen - Abnehmen aus der Datenbank.
  • Erstellen - Erstellen eines Modells.
  • Erstellt - Das Modell wurde erstellt.
  • Aktualisieren - Aktualisieren des Modells.
  • aktualisiert - Das Modell wurde aktualisiert.
  • Speichern - Erstellen oder Aktualisieren eines Modells.
  • gespeichert - Das Modell wurde erstellt oder aktualisiert.
  • L?schen - L?schen des Modells.
  • gel?scht - Das Modell wurde gel?scht.
  • Müll - Das Modell wurde sanft gel?scht.
  • erzwungenes Handeln - Erzwungene L?schung des Modells.
  • erzwungen - das Modell wurde gezwungen,
  • gel?scht zu werden
  • Wiederherstellung - Wiederherstellen des Modells aus der weichen L?schung.
  • restauriert - Das Modell wurde aus Soft Delete wiederhergestellt.
  • replizieren - Replikation des Modells.

creating In der obigen Liste k?nnen Sie einige Ereignisnamen ?hnlich bemerken; Ereignisse, die mit created enden, werden vor dem Vorgang ausgeführt, und die ?nderungen werden in der Datenbank bestehen. Ereignisse, die mit ing enden, werden nach dem Vorgang ausgeführt, und die ?nderungen werden in der Datenbank bestehen. ed

Lassen Sie uns sehen, wie diese Modellereignisse in einer Laravel -Anwendung verwendet werden.

Verwenden Sie

Modell Ereignisse dispatchesEvents


Eine M?glichkeit, auf Modellereignisse zuzuh?ren, besteht darin, eine

-Mobilie auf Ihrem Modell zu definieren. dispatchesEvents

Mit dieser Eigenschaft k?nnen Sie eloquente Modellereignisse in die Ereignisklasse zuordnen, die bei der Aufführung des Ereignisses geplant werden sollte. Dies bedeutet, dass Sie den H?rer so definieren k?nnen, wie Sie es für jedes andere Ereignis verarbeiten würden.

Um mehr Kontext bereitzustellen, schauen wir uns ein Beispiel an.

Angenommen, wir erstellen eine Blog -Anwendung mit zwei Modellen:

und AppModelsPost. Wir werden sagen, dass beide Modelle eine weiche L?schung unterstützen. Wenn wir ein neues AppModelsAuthor speichern, m?chten wir die Lesezeit des Artikels basierend auf der L?nge des Inhalts berechnen. Wenn wir den Autor sanft l?schen, m?chten wir, dass der Autor alle Artikel sanft l?scht. AppModelsPost

#Set das Modell

wir k?nnen ein

Modell haben, wie unten gezeigt: AppModelsAuthor

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);
Im obigen Modell haben wir:

  • addierte eine dispatchesEvents -Mobilie hinzu, die das deleted -Modellereignis der Ereignisklasse AppEventsAuthorDeleted ordnet. Dies bedeutet, dass beim L?schen des Modells ein neues AppEventsAuthorDeleted -Ereignis geplant wird. Wir werden diese Ereignisklasse sp?ter erstellen.
  • definiert eine posts -Beziehung.
  • Die weiche L?schung
  • wird auf dem Modell mithilfe der Funktion IlluminateDatabaseEloquentSoftDeletes aktiviert.

Erstellen wir unser AppModelsPost Modell:

declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

im obigen AppModelsPost Modell haben wir:

  • addierte eine dispatchesEvents -Mobilie hinzu, die das saving -Modellereignis der Ereignisklasse AppEventsPostSaving ordnet. Dies bedeutet, dass beim Erstellen oder Aktualisieren des Modells ein neues AppEventsPostSaving -Ereignis geplant wird. Wir werden diese Ereignisklasse sp?ter erstellen.
  • definiert eine author -Beziehung.
  • Die weiche L?schung
  • wird auf dem Modell mithilfe der Funktion IlluminateDatabaseEloquentSoftDeletes aktiviert.

Unser Modell ist jetzt bereit, also erstellen wir unsere Ereignisklassen AppEventsAuthorDeleted und AppEventsPostSaving.

#create Ereignisklasse

Wir erstellen eine AppEventsPostSaving Ereignisklasse, die beim Speichern eines neuen Artikels geplant ist:

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);

Im obigen Code k?nnen wir die Ereignisklasse AppEventsPostSaving sehen, die eine AppModelsPost -Modellinstanz in seinem Konstruktor akzeptiert. Diese Ereignisklasse ist ein einfacher Container zum Speichern der zu speichernden Artikelinstanz.

In ?hnlicher Weise k?nnen wir eine AppEventsAuthorDeleted Ereignisklasse erstellen, die beim L?schen des Autors geplant ist:

declare(strict_types=1);

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Mail;

final readonly class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        $event->user->notify(new WelcomeNotification());
    }
}

In der obigen AppEventsAuthorDeleted -Klass k?nnen wir sehen, dass der Konstruktor eine AppModelsAuthor Modellinstanz akzeptiert.

Jetzt k?nnen wir weiterhin Zuh?rer erstellen.

#create louser

Lassen Sie uns zun?chst einen H?rer erstellen, mit dem die Sch?tzung der Lesezeit des Artikels berechnet werden kann.

Wir werden eine neue AppListenersCalculateReadTime H?rerklasse erstellen:

UserRegistered::dispatch($user);

Wie wir im obigen Code sehen, haben wir nur eine handle -Methode. Dies ist eine Methode, die beim Planen des AppEventsPostSaving -Ergners automatisch aufgerufen wird. Es akzeptiert eine Instanz der Ereignisklasse AppEventsPostSaving, die den zu speichernden Artikel enth?lt.

In der Methode handle verwenden wir eine einfache Formel, um die Lesezeit des Artikels zu berechnen. In diesem Beispiel gehen wir davon aus, dass die durchschnittliche Lesegeschwindigkeit 265 W?rter pro Minute betr?gt. Wir berechnen die Lesezeit in Sekunden und setzen dann das read_time_in_seconds -Merkmal im Artikelmodell ein.

Da dieser H?rer aufgerufen wird, wenn das Modell saving Modell ausgel?st wird, bedeutet dies, dass das Attribut read_time_in_seconds jedes Mal berechnet wird, wenn der Artikel vor dem Erstellen oder Aktualisieren in der Datenbank bestehen wird.

Wir k?nnen auch einen H?rer erstellen, der alle verwandten Artikel sanft l?scht, wenn der Autor sanft l?scht.

Wir k?nnen eine neue AppListenersSoftDeleteAuthorRelationships H?rerklasse erstellen:

declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

Im obigen H?rer akzeptiert die handle -Methode eine Instanz der Ereignisklasse AppEventsAuthorDeleted. Diese Ereignisklasse enth?lt, dass der Autor gel?scht wird. Anschlie?end verwenden wir die posts -Beziehung, um den Artikel des Autors zu l?schen. delete

Daher werden alle Artikel der Autoren, wenn das Modell

sanft gel?scht wird, ebenfalls sanft gel?scht. AppModelsAuthor

Es ist übrigens erw?hnenswert, dass Sie m?glicherweise eine leistungsst?rkere, wiederverwendbare L?sung verwenden m?chten, um dies zu erreichen. Aber für die Zwecke dieses Artikels halten wir es einfach.

Verwenden Sie den Verschluss, um auf Modellereignisse zu h?ren


Eine andere M?glichkeit, den H?rer als Schlie?ung des Modells selbst zu definieren.

Schauen wir uns das Beispiel für weiche L?schartikel an, wenn wir den Autor sanft gel?scht haben. Wir k?nnen unser

-Modell aktualisieren, um einen Verschluss zu enthalten, der für AppModelsAuthor Modellereignisse h?rt: deleted

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);
wir k?nnen im obigen Modell sehen, dass wir den H?rer in der

-Methode des Modells definieren. Wir m?chten auf das booted Modellereignis zuh?ren, also haben wir deleted verwendet. In ?hnlicher Weise k?nnen wir self::deleted usw. verwenden, wenn wir einen H?rer für das created -Modellereignis erstellen m?chten. Die self::created -Methode akzeptiert einen Verschluss, der das gel?schte self::deleted erh?lt. Diese Schlie?ung wird ausgeführt, wenn das Modell gel?scht wird, sodass alle Autorenartikel gel?scht werden. AppModelsAuthor

Ich mag diese Art, die Logik der H?rer zu definieren, wirklich, da sie sofort sehen kann, ob es einen Beobachter beim ?ffnen der Modellklasse registriert. W?hrend die Logik in einer separaten Datei immer noch "versteckt" ist, k?nnen wir wissen, dass wir die H?rer für mindestens ein Ereignis des Modells registriert haben. Wenn der Code in diesen Schlie?ungen jedoch komplexer wird, kann es sich lohnt, die Logik in eine separate H?rerklasse zu extrahieren.

Ein praktischer Trick ist, dass Sie auch die Funktion

verwenden k?nnen, um die Schlie?ungen in der Warteschlange zu bringen. Dies bedeutet, dass der Code des H?rers in die Warteschlange gedr?ngt wird, um im Hintergrund zu laufen, und nicht im gleichen Anfrage -Lebenszyklus. Wir k?nnen den H?rer wie folgt auf Warteschlangen aktualisieren: IlluminateEventsqueueable

declare(strict_types=1);

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Mail;

final readonly class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        $event->user->notify(new WelcomeNotification());
    }
}
Wie wir im obigen Beispiel gesehen haben, wickeln wir den Verschluss in die

-Funktion ein. IlluminateEventsqueueable

Verwenden Sie den Beobachter, um auf Modellereignisse zu h?ren


Eine andere M?glichkeit, wie Sie auf Modellereignisse anh?ren k?nnen, besteht darin, Modellbeobachter zu verwenden. Mit Modellbeobachtern k?nnen Sie alle Zuh?rer für das Modell in einer Klasse definieren.

Normalerweise sind es Klassen, die im Verzeichnis app/Observers vorhanden sind, und sie haben Methoden, die den Modellereignissen entsprechen, die Sie h?ren m?chten. Wenn Sie beispielsweise auf ein deleted -Modellereignis zuh?ren m?chten, definieren Sie eine deleted -Methode in der Beobachterklasse. Wenn Sie auf ein created Modellereignis zuh?ren m?chten, definieren Sie eine created -Methode in der Beobachterklasse und so weiter.

Lassen Sie uns sehen, wie Sie einen Modellbeobachter für unser AppModelsAuthor Modellh?ren für deleted Modellereignisse erstellen:

declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

Wie wir im obigen Code sehen, erstellen wir einen Beobachter mit der deleted -Methode. Diese Methode akzeptiert Instanzen des gel?schten AppModelsAuthor -Modells. Anschlie?end verwenden wir die posts -Beziehung, um den Artikel des Autors zu l?schen. delete

Angenommen, wir m?chten zum Beispiel auch Zuh?rer für

und created Modellereignisse definieren. Wir k?nnen unsere Beobachter wie folgt aktualisieren: updated

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);
Um die

-Methode auszuführen, müssen wir Laravel anweisen, sie zu verwenden. Dazu k?nnen wir das AppObserversAuthorObserver -Merkmal verwenden. Dies erm?glicht es uns, Beobachter mit dem Modell zu assoziieren, ?hnlich wie bei der Registrierung globaler Abfragebereiche mithilfe des #[IlluminateDatabaseEloquentAttributesObservedBy] -attributs (wie gezeigt, wie das Abfragebuch in Laravel beherrscht). Wir k?nnen unser #[ScopedBy] -Modell wie dieses aktualisieren, um den Beobachter zu verwenden: AppModelsAuthor

declare(strict_types=1);

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Mail;

final readonly class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        $event->user->notify(new WelcomeNotification());
    }
}
Ich mag diese Art, die Logik der H?rer zu definieren, sehr, da sie sofort sehen kann, ob es einen Beobachter beim ?ffnen der Modellklasse registriert. W?hrend die Logik in einer separaten Datei immer noch "versteckt" ist, k?nnen wir wissen, dass wir die H?rer für mindestens ein Ereignis des Modells registriert haben.

Testen Sie Ihr Modellereignis


Unabh?ngig davon, welche Modellereignismethode Sie verwenden, m?chten Sie m?glicherweise einige Tests schreiben, um sicherzustellen, dass Ihre Logik wie erwartet funktioniert.

Lassen Sie uns sehen, wie die Modellereignisse, die wir im obigen Beispiel erstellt haben, testen.

Wir schreiben zuerst einen Test, um sicherzustellen, dass der Artikel des Autors sanft gel?scht wird, wenn der Autor sanft gel?scht wird. Der Test k?nnte so aussehen:

UserRegistered::dispatch($user);
Im obigen Test erstellen wir einen neuen Autor und Artikel für diesen Autor. Wir haben dann den Autor leise gel?scht und behauptet, dass sowohl der Autor als auch der Artikel sanft gel?scht wurden.

Dies ist ein sehr einfacher, aber effektiver Test, mit dem wir sicherstellen k?nnen, dass unsere Logik wie erwartet funktioniert. Der Vorteil dieses Tests besteht darin, dass er mit jeder der in diesem Artikel diskutierten Methoden funktionieren sollte. Wenn Sie also zwischen einer der in diesem Artikel diskutierten Methoden wechseln, sollte Ihr Test noch bestehen.

In ?hnlicher Weise k?nnen wir einige Tests schreiben, um sicherzustellen, dass die Lesezeit des Artikels beim Erstellen oder Aktualisieren berechnet wird. Der Test k?nnte so aussehen:

declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

Wir haben zwei Tests darauf:

  • Der erste Test stellt sicher, dass die Lesezeit des Artikels beim Erstellen berechnet wird.
  • Der zweite Test stellt sicher, dass die Lesezeit des Artikels berechnet wird, wenn der Artikel aktualisiert wird.

Vorsichtsma?nahmen bei der Verwendung von Modellereignissen


Obwohl Modellereignisse sehr bequem sind, müssen einige Probleme bei der Verwendung bewusst sein.

Modellereignisse stammen nur aus dem eloquenten Modell. Dies bedeutet, dass ihre Ereignisse nicht geplant sind, wenn Sie IlluminateSupportFacadesDB Fassade verwenden, um mit den zugrunde liegenden Daten des Modells in der Datenbank zu interagieren.

Schauen wir uns beispielsweise ein einfaches Beispiel an, wir verwenden IlluminateSupportFacadesDB Fassade, um den Autor zu l?schen:

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);

Ausführen des oben genannten Codes l?scht den Autor wie erwartet aus der Datenbank. Die Modellereignisse deleting und deleted sind jedoch nicht geplant. Wenn Sie also H?rer für diese Modellereignisse definieren, wenn Sie den Autor l?schen, werden sie nicht ausgeführt.

In ?hnlicher Weise sind für die betroffenen Modelle die saved, updated, deleting und deleted Modellereignisse nicht geplant. Dies liegt daran, dass Ereignisse aus dem Modell selbst geplant sind. Wenn jedoch Batch -Updates und -L?ser aktualisiert werden, wird das Modell nicht tats?chlich aus der Datenbank abgerufen, sodass Ereignisse nicht geplant sind.

Angenommen, wir verwenden den folgenden Code, um den Autor zu l?schen:

declare(strict_types=1);

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Mail;

final readonly class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        $event->user->notify(new WelcomeNotification());
    }
}

Da die Methode delete direkt im Abfragebauer aufgerufen wird, sind die Modellereignisse deleting und deleted für diesen Autor nicht geplant.

Alternative Methoden zur Betrachtung


Ich benutze Modellereignisse in meinen Projekten gerne. Sie dienen als eine gute M?glichkeit, meinen Code zu entkoppeln und es mir auch erm?glichen, die Logik automatisch auszuführen, wenn ich nicht viel Kontrolle über den Code habe, der das Modell betrifft. Wenn ich beispielsweise den Autor in Laravel Nova l?sche, kann ich beim L?schen des Autors immer noch eine Logik ausführen.

Es ist jedoch wichtig zu wissen, wann man verschiedene Methoden angewendet hat.

Um dies zu erkl?ren, schauen wir uns ein grundlegendes Beispiel an, in dem wir m?glicherweise Modellereignisse vermeiden m?chten. Erweitern Sie unser vorheriges Beispiel für einfache Blog -Anwendungen, vorausgesetzt, wir m?chten beim Erstellen eines neuen Beitrags Folgendes ausführen:

  • Berechnen Sie die Lesezeit des Artikels.
  • API -Anrufe an X/Twitter senden, um den Artikel zu teilen.
  • Benachrichtigungen an jeden Abonnenten auf der Plattform senden.

Sie k?nnen also drei separate H?rer (eine für jede Aufgabe) erstellen, die jedes Mal ausgeführt werden, wenn eine neue AppModelsPost -Stanz erstellt wird.

Aber jetzt lasst uns einen unserer vorherigen Tests überprüfen:

declare(strict_types=1);

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

final class UserRegistered
{
    use Dispatchable;
    use InteractsWithSockets;
    use SerializesModels;

    public function __construct(public User $user)
    {
        //
    }
}

Wenn wir den obigen Test ausführen, l?st er diese drei Vorg?nge auch aus, wenn das AppModelsPost -Modell über seine Fabrik erstellt wird. Natürlich ist die Berechnung der Lesezeit eine sekund?re Aufgabe, daher spielt es keine Rolle. Wir m?chten jedoch nicht versuchen, API -Anrufe zu t?tigen oder Benachrichtigungen w?hrend des Tests zu senden. Dies sind unerwartete Nebenwirkungen. Wenn der Entwickler, der den Test schrieb, diese Nebenwirkungen nicht bekannt ist, kann es schwierig sein, herauszufinden, warum diese Vorg?nge auftreten.

Wir m?chten auch vermeiden, dass eine testspezifische Logik im H?rer geschrieben wird, was verhindert, dass diese Operationen w?hrend der Tests ausgeführt werden. Dadurch wird der Anwendungscode komplexer und gewartet.

Dies ist einer der F?lle, in denen Sie einen expliziteren Ansatz in Betracht ziehen m?chten, anstatt sich auf automatische Modellereignisse zu verlassen.

Eine M?glichkeit kann darin bestehen, Ihren Erstellungscode AppModelsPost in einen Dienst oder eine Aktionsklasse zu extrahieren. Zum Beispiel k?nnte eine einfache Dienstklasse so aussehen:

use App\Events\UserRegistered;
use App\Models\User;

$user = User::create([
    'name' => 'Eric Barnes',
    'email' => 'eric@example.com',
]);

UserRegistered::dispatch($user);

In der obigen Klasse rufen wir den Code manuell auf, der die Lesezeit berechnet, Benachrichtigungen und Beitr?ge an Twitter sendet. Dies bedeutet, dass wir eine bessere Kontrolle darüber haben, wenn diese Operationen ausgeführt werden. Wir k?nnen diese Methoden auch in Tests auch leicht verspotten, um zu verhindern, dass sie laufen. Wir k?nnen diese Operationen bei Bedarf immer noch anstellen (in diesem Fall werden wir dies h?chstwahrscheinlich tun).

Daher k?nnen wir die Modellereignisse und Zuh?rer für diese Operationen l?schen. Dies bedeutet, dass wir diese neue AppServicesPostService -Klasse in unserem Anwendungscode verwenden und die Modellfabrik in unserem Testcode sicher verwenden k?nnen.

Der zus?tzliche Vorteil davon ist, dass der Code auch das Verst?ndnis erleichtert. Wie ich kurz erw?hnte, ist eine h?ufige Kritik an der Verwendung von Ereignissen und Zuh?rern, dass sie die Gesch?ftslogik an unerwarteten Orten verbergen kann. Wenn also neue Entwickler dem Team beitreten und durch Modellereignisse ausgel?st werden, wissen sie m?glicherweise nicht, wo oder warum einige Operationen eintreten.

Wenn Sie jedoch noch Ereignisse und H?rer für eine solche Logik verwenden m?chten, k?nnen Sie einen expliziteren Ansatz verwenden. Sie k?nnen beispielsweise ein Ereignis aus der Serviceklasse planen, um den H?rer auszul?sen. Auf diese Weise k?nnen Sie immer noch die Entkopplungsvorteile von Ereignissen und Zuh?rern nutzen, aber Sie haben eine bessere Kontrolle darüber, wenn Ereignisse geplant sind.

Zum Beispiel k?nnen wir die obige AppServicesPostService -Methode in unserem createPost -Albile aktualisieren, um Ereignisse zu planen:

declare(strict_types=1);

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Mail;

final readonly class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        $event->user->notify(new WelcomeNotification());
    }
}

Mit der obigen Methode k?nnen wir immer noch einen separaten H?rer haben, um API -Anfragen zu stellen und Benachrichtigungen an Twitter zu senden. Wir haben jedoch eine bessere Kontrolle darüber, wenn diese Operationen ausgeführt werden, sodass sie beim Testen mithilfe der Modellfabrik nicht ausgeführt werden.

Es gibt keine goldene Regel bei der Entscheidung, eine dieser Methoden zu verwenden. Es h?ngt alles von Ihnen, Ihrem Team und den Funktionen ab, die Sie bauen. Ich neige jedoch dazu, die folgenden Faustregeln zu befolgen:

  • Wenn die Operationen im H?rer nur geringfügige ?nderungen des Modells vornehmen, sollten Sie Modellereignisse verwenden. Beispiel: Schnecken generieren, Lesezeit berechnen usw.
  • Wenn sich der Vorgang auf ein anderes Modell auswirkt (unabh?ngig davon, ob es automatisch erstellt, aktualisiert oder gel?scht wird), ist es klarer und verwenden keine Modellereignisse.
  • Wenn der Vorgang mit externen Prozessen (API -Aufrufe, Dateiverarbeitung, Triggerbenachrichtigungen, in der Warteschleife) gearbeitet wird, ist klarer, dass Sie keine Modellereignisse verwenden.

Vor- und Nachteile der Verwendung von Modellereignissen


Um schnell zusammenzufassen, was wir in diesem Artikel eingeführt haben, finden Sie hier einige der Vor- und Nachteile der Verwendung von Modellereignissen:

#Pros

  • Ermutigen Sie, den Code zu entkoppeln.
  • Mit
  • k?nnen Sie Aktionen automatisch ausl?sen, unabh?ngig davon, wo das Modell erstellt/aktualisiert/l?schen wird. Wenn das Modell beispielsweise in Laravel Nova erstellt wurde, k?nnen Sie die Gesch?ftslogik ausl?sen.
  • Sie müssen sich nicht daran erinnern, Ereignisse jedes Mal zu planen, wenn Sie ein Modell erstellen/aktualisieren/l?schen.

#disadVantages

  • kann unerwartete Nebenwirkungen verursachen. M?glicherweise m?chten Sie das Modell erstellen/aktualisieren/l?schen, ohne einige Zuh?rer auszul?sen. Dies kann jedoch zu unerwartetem Verhalten führen. Dies ist besonders beim Schreiben von Tests problematisch.
  • Gesch?ftslogik kann an unerwarteten Orten versteckt sein, die schwer zu verfolgen sind. Dadurch wird der Code schwieriger zu verstehen.

Schlussfolgerung


Ich hoffe, dieser Artikel bietet einen überblick darüber, welche Modellereignisse und die verschiedenen M?glichkeiten, sie zu verwenden,. Es sollte Ihnen auch zeigen, wie Sie Modellereigniscodes und einige Probleme testen, die Sie bei der Verwendung bewusst sind.

Sie sollten jetzt genug Vertrauen haben, um Modellereignisse in Ihrer Laravel -Anwendung zu verwenden.

Das obige ist der detaillierte Inhalt vonEin Leitfaden zu Laravels Modellereignissen. 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

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

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.

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)

Hei?e Themen

PHP-Tutorial
1502
276
Variabler PHP -Bereich erkl?rt Variabler PHP -Bereich erkl?rt Jul 17, 2025 am 04:16 AM

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Wie behandle ich Datei -Uploads sicher in PHP? Wie behandle ich Datei -Uploads sicher in PHP? Jul 08, 2025 am 02:37 AM

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Code in PHP aus dem Code ausgehen Code in PHP aus dem Code ausgehen Jul 18, 2025 am 04:57 AM

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

Wie arbeiten Generatoren in PHP? Wie arbeiten Generatoren in PHP? Jul 11, 2025 am 03:12 AM

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Tipps zum Schreiben von PHP -Kommentaren Tipps zum Schreiben von PHP -Kommentaren Jul 18, 2025 am 04:51 AM

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

PHP lernen: Ein Anf?ngerführer PHP lernen: Ein Anf?ngerführer Jul 18, 2025 am 04:54 AM

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile

So greifen Sie in einer Zeichenfolge nach Index in PHP auf ein Zeichen zu So greifen Sie in einer Zeichenfolge nach Index in PHP auf ein Zeichen zu Jul 12, 2025 am 03:15 AM

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

SchnellpHP -Installations -Tutorial SchnellpHP -Installations -Tutorial Jul 18, 2025 am 04:52 AM

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

See all articles