本文由 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變現方案!