Manejo de eventos
webman/event
proporciona un mecanismo de eventos elegante que permite ejecutar cierta lógica empresarial sin invadir el código, logrando el desacoplamiento entre módulos de negocio. Un escenario típico es cuando un nuevo usuario se registra con éxito; simplemente publicando un evento personalizado como user.register
, los diferentes módulos podrán recibir dicho evento y ejecutar la lógica empresarial correspondiente.
Instalación
composer require webman/event
Suscribir eventos
La suscripción a eventos se configura unificada a través del archivo config/event.php
<?php
return [
'user.register' => [
[app\event\User::class, 'register'],
// ...otras funciones de manejo de eventos...
],
'user.logout' => [
[app\event\User::class, 'logout'],
// ...otras funciones de manejo de eventos...
]
];
Nota:
user.register
user.logout
, etc. son nombres de eventos, de tipo cadena, se recomienda usar palabras en minúsculas y separarlas con puntos (.
)- Un evento puede corresponder a múltiples funciones de manejo de eventos, el orden de llamada es el del orden de configuración.
Funciones de manejo de eventos
Las funciones de manejo de eventos pueden ser cualquier método de clase, función, o función anónima, etc.
Por ejemplo, se puede crear una clase de manejo de eventos en app/event/User.php
(si el directorio no existe, créelo tú mismo)
<?php
namespace app\event;
class User
{
function register($user)
{
var_export($user);
}
function logout($user)
{
var_export($user);
}
}
Publicar eventos
Se publica un evento utilizando Event::dispatch($event_name, $data);
o Event::emit($event_name, $data);
, por ejemplo
<?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);
}
}
Hay dos funciones para publicar eventos, Event::dispatch($event_name, $data);
y Event::emit($event_name, $data);
que tienen los mismos parámetros.
La diferencia es que emit
capturará automáticamente las excepciones; es decir, si un evento tiene múltiples funciones de manejo, una excepción en una función no afectará la ejecución de las demás.
Mientras que dispatch
no captura automáticamente las excepciones; si alguna de las funciones de manejo del evento actual lanza una excepción, se detendrá la ejecución de la siguiente función y lanzará la excepción hacia arriba.
Consejo
El parámetro$data
puede ser cualquier tipo de dato, como un array, instancia de clase, cadena, etc.
Escucha de eventos con comodines
La escucha con comodines permite manejar múltiples eventos en un mismo oyente, por ejemplo, en la configuración de config/event.php
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
Podemos obtener el nombre específico del evento a través del segundo parámetro $event_data
de la función de manejo de eventos
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // Nombre específico del evento, como user.register, user.logout, etc.
var_export($user);
}
}
Detener la difusión de eventos
Cuando retornamos false
en la función de manejo de eventos, se detendrá la difusión de dicho evento.
Uso de funciones anónimas para manejar eventos
Las funciones de manejo de eventos pueden ser métodos de clase, así como funciones anónimas, por ejemplo
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
Ver eventos y oyentes
Utiliza el comando php webman event:list
para ver todos los eventos y oyentes configurados en el proyecto.
Alcance de soporte
Además del plugin base y el plugin de aplicación en el proyecto principal, también se admite la configuración de event.php.
Archivo de configuración de plugin base config/plugin/ProveedorDePlugin/NombreDePlugin/event.php
Archivo de configuración de plugin de aplicación plugin/NombreDePlugin/config/event.php
Consideraciones
El manejo de eventos no es asíncrono, por lo que event
no es adecuado para manejar procesos lentos; los procesos lentos deben ser manejados mediante colas de mensajes, como webman/redis-queue