Event-Eventverarbeitung
webman/event bietet einen raffinierten Ereignismechanismus, der es ermöglicht, Geschäftslogiken auszuführen, ohne den Code zu ändern, und damit die Entkopplung zwischen Geschäftsmodulen zu erreichen. Typisches Szenario: Wenn ein neuer Benutzer sich erfolgreich registriert, wird einfach ein benutzerdefiniertes Ereignis wie user.register veröffentlicht, und jedes Modul kann dieses Ereignis empfangen und die entsprechende Geschäftslogik ausführen.
Installation
composer require webman/event
Ereignis abonnieren
Ereignis-Abonnements werden einheitlich in der Datei config/event.php konfiguriert.
<?php
return [
'user.register' => [
[app\event\User::class, 'register'],
// ...andere Ereignisverarbeitungsfunktionen...
],
'user.logout' => [
[app\event\User::class, 'logout'],
// ...andere Ereignisverarbeitungsfunktionen...
]
];
Hinweis:
user.register,user.logoutusw. sind Ereignisnamen (Zeichenketten). Empfohlen werden Kleinbuchstaben, mit Punkt (.) getrennt.- Ein Ereignis kann mehreren Ereignisverarbeitungsfunktionen entsprechen; sie werden in der Reihenfolge der Konfiguration aufgerufen.
Ereignisverarbeitungsfunktionen
Ereignisverarbeitungsfunktionen können beliebige Klassenmethoden, Funktionen oder Closure-Funktionen sein.
Erstellen Sie z. B. die Ereignisverarbeitungsklasse app/event/User.php (Verzeichnis bei Bedarf anlegen).
<?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); zum Veröffentlichen von Ereignissen, z. B.:
<?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 zum Veröffentlichen: Event::dispatch($event_name, $data); und Event::emit($event_name, $data); — beide mit denselben Parametern. Der Unterschied: emit fängt Ausnahmen intern ab; wirft eine Verarbeitungsfunktion eine Ausnahme, laufen die anderen dennoch weiter. Bei dispatch werden Ausnahmen nicht abgefangen; wirft eine Verarbeitungsfunktion eine Ausnahme, bricht die Ausführung ab und die Ausnahme wird weitergeworfen.
Hinweis
Der Parameter$datakann beliebige Daten sein (z. B. Arrays, Klasseninstanzen, Zeichenketten).
Wildcard-Ereignisüberwachung
Mit Wildcard-Registrierung können Sie mehrere Ereignisse mit demselben Listener behandeln, z. B. in config/event.php:
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
Über den zweiten Parameter $event_data der Ereignisverarbeitungsfunktion erhalten Sie den konkreten Ereignisnamen:
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // konkreter Ereignisname, z. B. user.register, user.logout usw.
var_export($user);
}
}
Ereignisübertragung stoppen
Wenn die Ereignisverarbeitungsfunktion false zurückgibt, wird die Übertragung des Ereignisses gestoppt.
Ereignisverarbeitung mit Closure
Die Ereignisverarbeitungsfunktion kann eine Klassenmethode oder eine Closure sein, z. B.:
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
Ereignisse und Listener anzeigen
Mit dem Befehl php webman event:list können Sie alle im Projekt konfigurierten Ereignisse und Listener anzeigen.
Unterstützte Bereiche
Neben dem Hauptprojekt unterstützen auch Basis-Plugins und App-Plugins die event.php-Konfiguration.
Basis-Plugin-Konfiguration: config/plugin/Hersteller/Pluginname/event.php
App-Plugin-Konfiguration: plugin/Pluginname/config/event.php
Hinweise
Die Event-Verarbeitung ist nicht asynchron und nicht für langsame Geschäftslogik geeignet; diese sollte über Message Queues abgearbeitet werden, z. B. webman/redis-queue.