定义事件

系统提供了两种定义事件的方式,一种是定义长期事件$fd = Event::on($event, [$class, $method]),直到被off之前都会生效。

参数分别为事件名方法[类,方法名] 方法可以不传,默认为Logger::event()方法,会在console中打印

$fd返回的是该事件的操作符。在调用off方法时,可以通过传递该操作符解绑该事件。

  1. namespace app\controller;
  2. /**
  3. * 主页Action
  4. * @property \app\service\testService $testService
  5. */
  6. class testAction extends baseAction
  7. {
  8. //构造函数
  9. public function init()
  10. {
  11. // 要触发beforeAction事件,可在init里定义,会在init之后被触发
  12. Event::on(beforeAction, array($this, 'test_event'));
  13. }
  14.  
  15. //默认路由index
  16. public function action_index()
  17. {
  18. // 绑定testService里的my_event1方法 和 my_event2方法 到 myEvent事件中,两个方法都会被执行,按绑定先后顺序执行
  19. $fd1 = Event::on('myEvent', array($this->testService, 'my_event1'));
  20. $fd2 = Event::on('myEvent', array($this->testService, 'my_event2'));
  21.  
  22. // do something .....
  23.  
  24. // 解绑myEvent事件的 my_event1方法
  25. Event::off('myEvent', $fd1);
  26.  
  27. // 解绑myEvent事件,所有绑定在该事件上的方法都不会再被执行
  28. Event::off('myEvent');
  29.  
  30. return $this->error('测试一下');
  31. }
  32.  
  33. // 自定义的事件类
  34. public function test_event($event)
  35. {
  36. // addLog为写日志的方法
  37. Logger::addLog('触发beforeAction事件');
  38. }
  39. }

另一种绑定则为一次绑定事件Event::one(),调用参数相同,返回$fd操作符,当该事件被触发一次后会自动解绑

  1. $fd = Event::one('myEvent', array($this, 'my_event'));

当然如果想要绑定多次但非长期绑定时,系统也提供了bind方法,参数用法类似。

  1. // 第一个参数绑定方法,第二个为事件名,第三个为绑定次数,触发次数满后自动释放
  2. $fd = Event::bind(array($this, 'my_event'), 'myEvent', $times);