webman 事件库 webman-event

license webman-event webman-event webman-event webman-event

事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

项目地址

https://github.com/Tinywan/webman-permission

依赖

安装

```shell script composer require tinywan/webman-event

  1. ## 配置
  2. 事件配置文件 `config/event.php` 内容如下
  3. ```php
  4. return [
  5. // 事件监听
  6. 'listener' => [],
  7. // 事件订阅器
  8. 'subscriber' => [],
  9. ];

进程启动配置

打开 config/bootstrap.php,加入如下配置:

  1. return [
  2. // 这里省略了其它配置 ...
  3. webman\event\EventManager::class,
  4. ];

快速开始

定义事件

事件类 LogErrorWriteEvent.php

  1. declare(strict_types=1);
  2. namespace extend\event;
  3. use Symfony\Contracts\EventDispatcher\Event;
  4. class LogErrorWriteEvent extends Event
  5. {
  6. const NAME = 'log.error.write'; // 事件名,事件的唯一标识
  7. /** @var array */
  8. public array $log;
  9. public function __construct(array $log)
  10. {
  11. $this->log = $log;
  12. }
  13. public function handle()
  14. {
  15. return $this->log;
  16. }
  17. }

监听事件

  1. return [
  2. // 事件监听
  3. 'listener' => [
  4. \extend\event\LogErrorWriteEvent::NAME => \extend\event\LogErrorWriteEvent::class,
  5. ],
  6. ];

订阅事件

订阅类 LoggerSubscriber.php

  1. namespace extend\event\subscriber;
  2. use extend\event\LogErrorWriteEvent;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. class LoggerSubscriber implements EventSubscriberInterface
  5. {
  6. /**
  7. * @desc: 方法描述
  8. * @return array|string[]
  9. */
  10. public static function getSubscribedEvents()
  11. {
  12. return [
  13. LogErrorWriteEvent::NAME => 'onLogErrorWrite',
  14. ];
  15. }
  16. /**
  17. * @desc: 触发事件
  18. * @param LogErrorWriteEvent $event
  19. */
  20. public function onLogErrorWrite(LogErrorWriteEvent $event)
  21. {
  22. // 一些具体的业务逻辑
  23. var_dump($event->handle());
  24. }
  25. }

事件订阅

  1. return [
  2. // 事件订阅
  3. 'subscriber' => [
  4. \extend\event\subscriber\LoggerSubscriber::class,
  5. ],
  6. ];

事件触发器

触发 LogErrorWriteEvent 事件。

  1. $error = [
  2. 'errorMessage' => '错误消息',
  3. 'errorCode' => 500
  4. ];
  5. EventManager::trigger(new LogErrorWriteEvent($error),LogErrorWriteEvent::NAME);

执行结果

打印结果

License

This project is licensed under the Apache 2.0 license.