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