event Ereignisverarbeitung
webman/event
bietet einen raffinierten Ereignismechanismus, der es ermöglicht, bestimmte Geschäftslogiken ohne Code-Intrusion auszuführen und eine Entkopplung zwischen den Geschäftsmodulen zu erreichen. Ein typisches Szenario ist, wenn ein neuer Benutzer erfolgreich registriert wird, genügt es, ein benutzerdefiniertes Ereignis wie user.register
zu veröffentlichen, damit alle Module dieses Ereignis empfangen und die entsprechenden Geschäftslogiken ausführen können.
Installation
composer require webman/event
Ereignis abonnieren
Das Abonnieren von Ereignissen erfolgt einheitlich über die Datei config/event.php
<?php
return [
'user.register' => [
[app\event\User::class, 'register'],
// ...andere Ereignisverarbeitungsfunktionen...
],
'user.logout' => [
[app\event\User::class, 'logout'],
// ...andere Ereignisverarbeitungsfunktionen...
]
];
Hinweis:
user.register
,user.logout
usw. sind die Ereignisnamen, vom Typ String, empfohlen wird die Verwendung von Kleinbuchstaben und die Trennung durch Punkte (.
)- Ein Ereignis kann mehreren Ereignisverarbeitungsfunktionen zugeordnet sein, die Aufrufreihenfolge entspricht der Konfiguration
Ereignisverarbeitungsfunktionen
Ereignisverarbeitungsfunktionen können beliebige Klassenmethoden, Funktionen, Closure-Funktionen usw. sein.
Zum Beispiel, erstellen Sie die Ereignisverarbeitungsklasse app/event/User.php
(das Verzeichnis bitte selbst erstellen, falls nicht vorhanden)
<?php
namespace app\event;
class User
{
function register($user)
{
var_export($user);
}
function logout($user)
{
var_export($user);
}
}
Ereignis veröffentlichen
Verwenden Sie Event::dispatch($event_name, $data);
oder Event::emit($event_name, $data);
um Ereignisse zu veröffentlichen, zum Beispiel
<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
public function register(Request $request)
{
$user = [
'name' => 'webman',
'age' => 2
];
Event::dispatch('user.register', $user);
}
}
Es gibt zwei Funktionen zur Veröffentlichung von Ereignissen, Event::dispatch($event_name, $data);
und Event::emit($event_name, $data);
, beide Parameter sind gleich.
Der Unterschied besteht darin, dass emit
intern automatisch Ausnahmen abfängt, das bedeutet, wenn ein Ereignis mehrere Verarbeitungsfunktionen hat und eine davon eine Ausnahme wirft, hat dies keine Auswirkungen auf die Ausführung der anderen Verarbeitungsfunktionen.
Im Gegensatz dazu fängt dispatch
keine Ausnahme automatisch ab. Wenn eine der Verarbeitungsfunktionen für das aktuelle Ereignis eine Ausnahme wirft, wird die Ausführung der nächsten Verarbeitungsfunktion gestoppt und die Ausnahme direkt nach oben geworfen.
Hinweis
Der Parameter$data
kann beliebige Daten wie Arrays, Klasseninstanzen, Strings usw. sein.
Wildcard-Ereignisüberwachung
Die Registrierung von Wildcards ermöglicht es, mehrere Ereignisse mit demselben Listener zu verarbeiten, beispielsweise in der Konfiguration von config/event.php
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
Wir können über den zweiten Parameter der Ereignisverarbeitungsfunktion $event_data
den spezifischen Ereignisnamen erhalten
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // spezifischer Ereignisname, z.B. user.register, user.logout usw.
var_export($user);
}
}
Ereignisübertragung stoppen
Wenn wir in der Ereignisverarbeitungsfunktion false
zurückgeben, wird die Übertragung dieses Ereignisses gestoppt.
Schließen von Funktionen zur Verarbeitung von Ereignissen
Ereignisverarbeitungsfunktionen können Klassennamen sein oder auch Closure-Funktionen, zum Beispiel
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
Ereignisse und Listener anzeigen
Verwenden Sie den Befehl php webman event:list
, um alle im Projekt konfigurierten Ereignisse und Listener anzuzeigen.
Unterstützter Umfang
Neben dem Hauptprojekt unterstützen auch die Grundplugins und Anwendungsplugins die Konfiguration von event.php.
Konfigurationsdatei für Grundplugins: config/plugin/Plugin-Hersteller/Plugin-Name/event.php
Konfigurationsdatei für Anwendungsplugins: plugin/Plugin-Name/config/event.php
Wichtige Hinweise
Die Ereignisverarbeitung ist nicht asynchron und eignet sich daher nicht zur Behandlung langsamer Prozesse; langsame Prozesse sollten mit einer Nachrichtenwarteschlange verarbeitet werden, wie zum Beispiel webman/redis-queue