多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作为保存与事件相关信息的容器,如没有额外需求可以不需要定义 事件系统的所有操作都通过think\facade\Event类进行静态调用 当定义事件类时 ```  // 在event.php中绑定事件标识 'bind' => [ 'EventDemo' => \app\event\EventDemo::class ], // 一个事件可以有很多不相关的监听器 'listen' => [ 'EventDemo' => [ \app\listener\ListenerDemoA::class, \app\listener\ListenerDemoB::class ] ], ``` // 或者可以这样动态绑定 ``` Event::bind(['EventDemo' => \app\event\EventDemo::class]); // 以下方式都可以触发事件 Event::trigger('EventDemo'); Event::trigger(\app\event\EventDemo::class); Event::trigger(new \app\event\EventDemo('EventDemo 初始化')); 不定义事件类时 'bind' => [ ], 'listen' => [ 'EventDemo' => [ \app\listener\ListenerDemoA::class, \app\listener\ListenerDemoB::class ] ], ``` // 以下方式触发事件 ``` Event::trigger('EventDemo'); ``` 此时就觉得bind比较多余,怎么说 ``` // 定义了事件类可以这样绑定 'bind' => [ ], 'listen' => [ \app\event\EventDemo::class => [ \app\listener\ListenerDemoA::class, \app\listener\ListenerDemoB::class ] ] // 这样就可以触发事件 Event::trigger(\app\event\EventDemo::class); Event::trigger(new \app\event\EventDemo('EventDemo 初始化')); ``` // 这么看来bind的作用也只能体现在前面写到的那样了 # 事件订阅 可以通过事件订阅机制,在一个监听器中监听多个事件 命令行生成事件订阅者类php think make:subscribe SubscribeDemo 订阅者类其实就是监听器的一个集合,在里面可以监听多个事件 ``` <?php declare (strict_types = 1); namespace app\subscribe; use think\Event; use think\facade\Log; 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中注册事件订阅者 ``` 'subscribe' => [ \app\subscribe\SubscribeDemo::class, // 更多事件订阅 ], ``` 或者动态注册 ``` Event::subscribe(\app\subscribe\SubscribeDemo::class); ``` 注册后就可以通过以下方式触发事件 ``` Event::trigger('EventInit'); // 通过助手函数 event('EventEnd'); ```