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.