- 事件绑定与监听
-
命令行生成事件类
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');
网友评论