- 事件绑定与监听
-
命令行生成事件类
php think make:event EventDemo -
命令行生成事件监听类
php think make:listener ListenerDemo
事件类可作为保存与事件相关信息的容器,如没有额外需求可以不需要定义
事件系统的所有操作都通过thinkfacadeEvent类进行静态调用
- 当定义事件类时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 在event.php中绑定事件标识 'bind' => [ 'EventDemo' => appeventEventDemo::class ], // 一个事件可以有很多不相关的监听器 'listen' => [ 'EventDemo' => [ applistenerListenerDemoA::class, applistenerListenerDemoB::class ] ], // 或者可以这样动态绑定 Event::bind(['EventDemo' => appeventEventDemo::class]); // 以下方式都可以触发事件 Event::trigger('EventDemo'); Event::trigger(appeventEventDemo::class); Event::trigger(new appeventEventDemo('EventDemo 初始化')); |
- 不定义事件类时
1 2 3 4 5 6 7 8 9 10 11 12 13 | 'bind' => [ ], 'listen' => [ 'EventDemo' => [ applistenerListenerDemoA::class, applistenerListenerDemoB::class ] ], // 以下方式触发事件 Event::trigger('EventDemo'); |
此时就觉得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 定义了事件类可以这样绑定 'bind' => [ ], 'listen' => [ appeventEventDemo::class => [ applistenerListenerDemoA::class, applistenerListenerDemoB::class ] ] // 这样就可以触发事件 Event::trigger(appeventEventDemo::class); Event::trigger(new appeventEventDemo('EventDemo 初始化')); // 这么看来bind的作用也只能体现在前面写到的那样了 |
- 事件订阅
可以通过事件订阅机制,在一个监听器中监听多个事件
命令行生成事件订阅者类
订阅者类其实就是监听器的一个集合,在里面可以监听多个事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php declare (strict_types = 1); namespace appsubscribe; use thinkEvent; use thinkfacadeLog; class SubscribeDemo { /** * 命名规范是on + 事件标识(驼峰命名) */ public function onEventInit($event) { // EventInit事件响应处理 Log::info('EventInit事件响应处理'); } public function eventEnd($event) { // EventEnd事件响应处理 Log::info('EventEnd事件响应处理'); } /** * 也可以通过subscribe方法来自定义事件标识注册事件监听器 */ public function subscribe(Event $event) { $event->listen('EventEnd',[$this,'eventEnd']); } } |
编写好事件订阅者类后在event.php中注册事件订阅者
1 2 3 4 | 'subscribe' => [ appsubscribeSubscribeDemo::class, // 更多事件订阅 ], |
或者动态注册
1 | Event::subscribe(appsubscribeSubscribeDemo::class); |
注册后就可以通过以下方式触发事件
1 2 3 | Event::trigger('EventInit'); // 通过助手函数 event('EventEnd'); |