A vantagem dos eventos em comparação com o middleware é que os eventos são posicionados com mais precisão (ou mais granulares) do que o middleware e são mais adequados para a expansão de alguns cenários de negócios. Por exemplo, geralmente encontramos usuários que precisam realizar uma série de operações após se registrar ou fazer login. Através do sistema de eventos, podemos completar a expansão da operação de login sem invadir o código original, o que não só reduz o acoplamento do sistema, mas também reduz a possibilidade de BUG.
composer require tinywan/event
Evento LogErrorWriteEvent.php
namespace extend ;
use Symfony Contracts EventDispatcher Event ;
class LogErrorWriteEvent extends Event
{
const NAME = ' log.error.write ' ; // 事件名,事件的唯一标识
public $ log ;
public function __construct ( array $ log )
{
$ this -> log = $ log ;
}
public function handle ()
{
return $ this -> log ;
}
}
escuta de evento
return [
// 事件监听
' listener ' => [
extend LogErrorWriteEvent:: NAME => extend LogErrorWriteEvent::class,
extend DingTalkEvent:: NAME => extend DingTalkEvent::class,
],
];
LoggerSubscriber.php
de assinaturaLoggerSubscriber.php
namespace extend ;
use Symfony Component EventDispatcher EventSubscriberInterface ;
use Symfony Contracts EventDispatcher Event ;
class LoggerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents (): array
{
// 监听的不同事件,当事件触发时,会调用 onResponse 方法
return [
extend LogErrorWriteEvent:: NAME => ' onResponse ' ,
extend DingTalkEvent:: NAME => ' onResponse ' ,
];
}
/**
* @desc: 触发事件
* @param Event $event
*/
public function onResponse ( Event $ event )
{
// 一些具体的业务逻辑
var_dump ( $ event -> handle ());
}
}
assinatura de evento
return [
// 事件订阅
' subscriber ' => [
extend LoggerSubscriber::class
],
];
Acione o evento LogErrorWriteEvent
.
$ error = [
' errorMessage ' => '错误消息' ,
' errorCode ' => 500
];
Tinywan Event:: trigger ( new extend LogErrorWriteEvent ( $ error ), extend LogErrorWriteEvent:: NAME );
$ error = [
' errorMessage ' => '错误消息' ,
' errorCode ' => 500
];
event ( new extend LogErrorWriteEvent ( $ error ), extend LogErrorWriteEvent:: NAME );
Resultado da execução
Este projeto está licenciado sob a licença Apache 2.0.