Manipulação de Eventos

webman/event fornece um mecanismo de eventos elegante que permite executar algumas lógicas de negócios sem a necessidade de interferir no código, alcançando o desacoplamento entre os módulos de negócios. Um cenário típico é que, quando um novo usuário se registra com sucesso, basta publicar um evento personalizado como user.register, e cada módulo poderá receber esse evento e executar a lógica de negócios correspondente.

Instalação

composer require webman/event

Assinatura de Eventos

A assinatura de eventos é configurada uniformemente através do arquivo config/event.php

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ... outras funções de manipulação de eventos ...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ... outras funções de manipulação de eventos ...
    ]
];

Nota:

  • user.register user.logout etc. são nomes de eventos, do tipo string, recomendando-se letras minúsculas e separação por pontos (.)
  • Um evento pode corresponder a várias funções de manipulação de eventos, e a ordem de chamada será a ordem especificada na configuração.

Funções de Manipulação de Eventos

As funções de manipulação de eventos podem ser quaisquer métodos de classe, funções, funções anônimas, etc.
Por exemplo, crie a classe de manipulação de eventos app/event/User.php (caso a pasta não exista, crie-a)

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

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

Publicação de Eventos

Use Event::dispatch($event_name, $data); ou Event::emit($event_name, $data); para publicar eventos, por exemplo

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

Existem duas funções para publicar eventos, Event::dispatch($event_name, $data); e Event::emit($event_name, $data); que possuem os mesmos parâmetros.
A diferença é que emit captura automaticamente as exceções internamente, ou seja, se um evento possui várias funções de manipulação, e uma delas gera uma exceção, isso não afetará a execução das outras funções de manipulação.
Enquanto dispatch não captura exceções automaticamente; se qualquer função de manipulação do evento atual lançar uma exceção, a execução das funções de manipulação seguintes será interrompida e a exceção será lançada.

Dica
O parâmetro $data pode ser qualquer tipo de dado, como arrays, instâncias de classe, strings, etc.

Escuta de Eventos com Coringas

A escuta com coringas permite que você manipule vários eventos em um único ouvinte. Por exemplo, configure em config/event.php

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

Podemos obter o nome do evento específico através do segundo parâmetro $event_data da função de manipulação de eventos.

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // nome do evento específico, como user.register, user.logout, etc.
        var_export($user);
    }
}

Parar a Difusão de Eventos

Quando retornamos false em uma função de manipulação de eventos, a difusão desse evento será interrompida.

Funções Anônimas para Manipulação de Eventos

As funções de manipulação de eventos podem ser métodos de classe ou funções anônimas, por exemplo:

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

Visualização de Eventos e Ouvintes

Use o comando php webman event:list para visualizar todos os eventos e ouvintes configurados no projeto.

Escopo de Suporte

Além do projeto principal, o plugin básico e os plugins de aplicativo também suportam a configuração do event.php.
Arquivo de configuração de plugin básico config/plugin/vendor_do_plugin/nome_do_plugin/event.php
Arquivo de configuração de plugin de aplicativo plugin/nome_do_plugin/config/event.php

Considerações

O tratamento de eventos não é assíncrono, e event não é adequado para processar negócios lentos, negócios lentos devem ser tratados com filas de mensagens, por exemplo, webman/redis-queue.