事件监听

全局事件

事件监听

注解监听

imi/src/Listener/Init.php为例

  1. <?php
  2. namespace Imi\Listener;
  3. use Imi\Event\EventParam;
  4. use Imi\Event\IEventListener;
  5. use Imi\Bean\Annotation\Listener;
  6. /**
  7. * @Listener(eventName="IMI.INITED",priority=PHP_INT_MAX)
  8. */
  9. class Init implements IEventListener
  10. {
  11. /**
  12. * 事件处理方法
  13. * @param EventParam $e
  14. * @return void
  15. */
  16. public function handle(EventParam $e)
  17. {
  18. // ...
  19. }
  20. }

首先需要定义一个类,类名和位置无所谓,只要配置了beanScan能被扫描到即可。

类必须实现IEventListener接口和public function handle(EventParam $e)方法。

然后在类上写@Listener注解。注解有两个参数:

eventName要监听的事件名称
priority事件触发后执行的优先级,数字越大越先执行,同样大执行顺序不一定

代码监听

除了使用注解,你还可以写代码手动监听

  1. use Imi\Event\Event;
  2. Event::on('事件名', function(){
  3. // 事件回调
  4. });
  5. $priority = 0;
  6. Event::on('事件名', function(){
  7. // 事件回调
  8. }, $priority);
  9. // 监听只触发一次
  10. Event::one('事件名', function(){});
  11. // 取消事件
  12. Event::off('事件名', $callable);

自定义事件

  1. use Imi\Event\Event;
  2. Event::trigger('事件名称', '传入事件回调的数据', '目标对象', '参数类,默认为EventParam::class');

局部事件

局部事件就是在某个类实例的事件。

事件监听

注解监听

imi/src/Server/Http/Listener/BeforeRequest.php为例

  1. <?php
  2. namespace Imi\Server\Http\Listener;
  3. use Imi\Bean\Annotation\ClassEventListener;
  4. use Imi\Server\Event\Param\RequestEventParam;
  5. use Imi\Server\Event\Listener\IRequestEventListener;
  6. /**
  7. * request事件前置处理
  8. * @ClassEventListener(className="Imi\Server\Http\Server",eventName="request",priority=PHP_INT_MAX)
  9. */
  10. class BeforeRequest implements IRequestEventListener
  11. {
  12. /**
  13. * 事件处理方法
  14. * @param RequestEventParam $e
  15. * @return void
  16. */
  17. public function handle(RequestEventParam $e)
  18. {
  19. // ...
  20. }
  21. }

首先需要定义一个类,类名和位置无所谓,只要配置了beanScan能被扫描到即可。

类必须实现对应接口和handle()方法,每个类的事件定义不同。

然后在类上写@ClassEventListener注解。注解参数如下:

className类名
eventName要监听的事件名称
priority事件触发后执行的优先级,数字越大越先执行,同样大执行顺序不一定

代码监听

  1. $object->on('事件名', function(){
  2. // 事件回调
  3. });
  4. $priority = 0;
  5. $object->on('事件名', function(){
  6. // 事件回调
  7. }, $priority);
  8. // 监听只触发一次
  9. $object->one('事件名', function(){});
  10. // 取消事件
  11. $object->off('事件名', $callable);

自定义事件

  1. $object->trigger('事件名称', '传入事件回调的数据', '目标对象', '参数类,默认为EventParam::class');