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