本文由 ChatMoney团队出品
在ThinkPHP 6中,事件系统提供了一种优雅的方式来实现解耦和动态响应。你可以通过注册事件和对应的监听者来处理各种应用逻辑。
事件注册
闭包注册
闭包是最简单的事件监听者,可以直接在注册时定义。
Event::listen("ClosureEvent", function(){var_dump("ClosureEvent1");
});
Event::listen("ClosureEvent", function(){var_dump("ClosureEvent2");
});
静态方法与普通方法注册
默认方法
首先定义一个事件类,并包含默认的处理方法。
// app\admin\event\testEvent.phpclass testEvent{// 默认方法public function handle(){var_dump("handle");
}
}
然后在index.php
中注册事件。
Event::listen("staticTest", "app\\admin\\event\\testEvent");
自定义方法
你也可以为事件类定义多个方法,并在注册时指定。
// app\admin\event\testEvent.php
class testEvent{
public function commonTest1(){var_dump("commonTest1");
}
public function commonTest2(){var_dump("commonTest2");
}
public static function staticTest1(){var_dump("staticTest1");
}
public static function staticTest2(){var_dump("staticTest2");
}
}
在index.php
中按需注册这些方法。
Event::listen("staticTest", "app\\admin\\event\\testEvent::staticTest1");
Event::listen("staticTest", "app\\admin\\event\\testEvent::staticTest2");
Event::listen("commonTest", ["app\\admin\\event\\testEvent", "commonTest1"]);
Event::listen("commonTest", ["app\\admin\\event\\testEvent", "commonTest2"]);
批量注册
如果需要注册多个监听者,可以使用批量注册方法。
Event::listenEvents([
"staticTest" => [
"app\\admin\\event\\testEvent::staticTest1",
"app\\admin\\event\\testEvent::staticTest2"],
"commonTest" => [
["app\\admin\\event\\testEvent", "commonTest1"],
["app\\admin\\event\\testEvent", "commonTest2"],
],
]);
事件订阅者
手动订阅
在事件类中定义一个subscribe
方法,手动添加监听者。
// app\admin\event\testEvent.phpclass testEvent{
// ... 已有方法 ...
public function subscribe(\think\Event $event){$event->listen("commonDefaultTest", "\\app\\admin\\event\\testEvent");
$event->listen("commonTest", ["\\app\\admin\\event\\testEvent", "commonTest1"]);$event->listen("commonTest", ["\\app\\admin\\event\\testEvent", "commonTest2"]);
$event->listen("staticTest", "\\app\\admin\\event\\testEvent::staticTest1");$event->listen("staticTest", "\\app\\admin\\event\\testEvent::staticTest2");
}
}
在index.php
中订阅事件。
Event::subscribe(["app\\admin\\event\\testEvent"]);
智能订阅
事件类的方法名遵循特定格式时,可以自动识别并订阅。
class testEvent{
public function onCommonTest1(){
var_dump("onCommonTest1");
}
public function onCommonTest2(){
var_dump("onCommonTest2");
}
}
触发事件时,方法名需大写。
Event::trigger("CommonTest1");
Event::trigger("CommonTest2");
调用事件
你可以使用trigger
方法来调用事件。
Event::trigger("commonTest");
event("commonTest");
高级用法
添加到监听者头部
通过设置listen
方法的第三个参数为true
,可以将监听者添加到监听者列表的头部。
Event::listen("staticTest","app\\admin\\event\\testEvent", true);
触发单个监听者
trigger
方法的第三个参数设置为true
时,如果有多个监听者,只触发第一个。
Event::trigger("CommonTest1", null, true);
移除事件
可以使用remove
方法来移除特定的事件监听者。
Event::remove("staticTest");
别名
可以为事件定义别名,使得事件触发更加灵活。
Event::bind(["commonTest1" => "app\\admin\\event\\testEvent"]);
Event::listen("commonTest1", ["app\\admin\\event\\testEvent", "commonTest1"]);
Event::trigger("commonTest1");
Event::trigger("app\\admin\\event\\testEvent");
检查事件是否存在
hasListener
方法可以用来检查某个事件是否有监听者。
Event::hasListener("commonTest1");
关于我们
本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!