event事件处理

webman/event fornisce un meccanismo di eventi raffinato, che consente di eseguire alcune logiche aziendali senza invasione del codice, realizzando una decoupling tra i moduli aziendali. Un scenario tipico è quando un nuovo utente si registra con successo: basta pubblicare un evento personalizzato come user.register, e i vari moduli possono ricevere questo evento per eseguire la logica aziendale corrispondente.

Installazione

composer require webman/event

Iscrizione agli eventi

L'inscrizione agli eventi viene configurata centralmente nel file config/event.php

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...Altre funzioni di gestione eventi...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...Altre funzioni di gestione eventi...
    ]
];

Nota:

  • user.register e user.logout sono nomi di eventi, di tipo stringa, si consiglia l'uso di parole minuscole separate da punti (.)
  • Un evento può corrispondere a più funzioni di gestione eventi, l'ordine di chiamata è quello configurato

Funzioni di gestione eventi

Le funzioni di gestione eventi possono essere metodi di classe, funzioni, funzioni anonime, ecc.
Ad esempio, crea una classe di gestione eventi app/event/User.php (se la directory non esiste, creala)

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

Pubblicazione di eventi

Usa Event::dispatch($event_name, $data); o Event::emit($event_name, $data); per pubblicare eventi, ad esempio

<?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);
    }
}

Ci sono due funzioni per pubblicare eventi, Event::dispatch($event_name, $data); e Event::emit($event_name, $data); con parametri uguali.
La differenza è che emit cattura automaticamente le eccezioni, il che significa che se un evento ha più funzioni di gestione e una di esse solleva un'eccezione, le altre funzioni di gestione continueranno a essere eseguite.
Al contrario, dispatch non cattura automaticamente le eccezioni: se una delle funzioni di gestione dell'evento solleva un'eccezione, l'esecuzione delle funzioni successive si interrompe e l'eccezione viene lanciata.

Suggerimento
Il parametro $data può essere qualsiasi tipo di dato, ad esempio un array, un'istanza di classe, una stringa, ecc.

Ascolto eventi con caratteri jolly

La registrazione di ascolti con caratteri jolly consente di gestire più eventi con lo stesso ascoltatore, ad esempio nel file config/event.php è possibile configurare

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

Possiamo ottenere il nome specifico dell'evento tramite il secondo parametro della funzione di gestione eventi $event_data

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // Nome specifico dell'evento, come user.register, user.logout, ecc.
        var_export($user);
    }
}

Arresto della diffusione degli eventi

Quando nella funzione di gestione eventi restituiamo false, l'evento smetterà di essere diffuso.

Funzioni anonime per gestire eventi

Le funzioni di gestione eventi possono essere metodi di classe o funzioni anonime, ad esempio

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

Visualizzare eventi e ascoltatori

Utilizza il comando php webman event:list per vedere tutti gli eventi e gli ascoltatori configurati nel progetto.

Ambito di supporto

Oltre al progetto principale, sia i plugin di base che i plugin per applicazioni supportano anche la configurazione di event.php.
File di configurazione del plugin di base config/plugin/fornitore/plugin/event.php
File di configurazione del plugin per applicazioni plugin/plugin/config/event.php

Note

La gestione degli eventi non è asincrona; gli eventi non sono adatti per gestire operazioni lente, che dovrebbero essere gestite tramite code di messaggi, ad esempio webman/redis-queue