Traitement des événements
webman/event
fournit un mécanisme d'événements ingénieux, pouvant exécuter certaines logiques métier sans altérer le code, réalisant ainsi le découplage entre les modules métiers. Un scénario typique est qu'à la réussite de l'enregistrement d'un nouvel utilisateur, il suffit de publier un événement personnalisé tel que user.register
, et tous les modules concernés recevront cet événement pour exécuter la logique métier correspondante.
Installation
composer require webman/event
Souscription aux événements
La souscription aux événements est configurée via le fichier config/event.php
<?php
return [
'user.register' => [
[app\event\User::class, 'register'],
// ...autres fonctions de traitement des événements...
],
'user.logout' => [
[app\event\User::class, 'logout'],
// ...autres fonctions de traitement des événements...
]
];
Remarque :
user.register
,user.logout
, etc. sont des noms d'événements, de type chaîne, il est recommandé d'utiliser des mots en minuscules séparés par des points (.
)- Un événement peut correspondre à plusieurs fonctions de traitement des événements, l'ordre d'appel est celui de la configuration.
Fonctions de traitement des événements
Les fonctions de traitement des événements peuvent être n'importe quelle méthode de classe, fonction, ou fonction anonyme, etc.
Par exemple, créer une classe de traitement des événements app/event/User.php
(si le répertoire n'existe pas, créez-le vous-même)
<?php
namespace app\event;
class User
{
function register($user)
{
var_export($user);
}
function logout($user)
{
var_export($user);
}
}
Publication des événements
Utilisez Event::dispatch($event_name, $data);
ou Event::emit($event_name, $data);
pour publier des événements, par exemple
<?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);
}
}
Il existe deux fonctions pour publier des événements, Event::dispatch($event_name, $data);
et Event::emit($event_name, $data);
avec des paramètres identiques.
La différence est que emit
capture automatiquement les exceptions. Cela signifie que si un événement a plusieurs fonctions de traitement et qu'une de ces fonctions génère une exception, l'exécution des autres fonctions de traitement ne sera pas impactée.
En revanche, dispatch
ne capture pas automatiquement les exceptions ; si l'une des fonctions de traitement de l'événement actuel génère une exception, elle arrête l'exécution de la fonction suivante et lance directement l'exception.
Conseil
Le paramètre$data
peut être n'importe quel type de donnée, par exemple un tableau, une instance de classe, une chaîne, etc.
Écoute d'événements avec un caractère générique
L'enregistrement d'écoute avec un caractère générique vous permet de traiter plusieurs événements dans un même écouteur, par exemple, dans la configuration config/event.php
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
Nous pouvons obtenir le nom d'événement spécifique via le deuxième paramètre $event_data
de la fonction de traitement des événements
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // Nom de l'événement spécifique, tel que user.register, user.logout, etc.
var_export($user);
}
}
Arrêter la diffusion des événements
Lorsque nous retournons false
dans la fonction de traitement des événements, cet événement arrêtera la diffusion.
Fonctions anonymes pour traiter les événements
Les fonctions de traitement des événements peuvent être des méthodes de classe ou des fonctions anonymes, par exemple
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
Voir les événements et les écouteurs
Utilisez la commande php webman event:list
pour voir tous les événements et écouteurs configurés dans le projet.
Étendue de support
Outre le projet principal, les plugins de base et les plugins d'application supportent également la configuration event.php.
Fichier de configuration des plugins de base config/plugin/nom_du_fournisseur/nom_du_plugin/event.php
Fichier de configuration des plugins d'application plugin/nom_du_plugin/config/event.php
Remarques
Le traitement d'événements n'est pas asynchrone et event
n'est pas adapté pour traiter des tâches lentes, celles-ci devraient être gérées par des files d'attente, par exemple webman/redis-queue