ThinkPHP6事件系統使用指南

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46107.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux操作系統之多文件管理

makefile: makefile文件用于管理和組織代碼工程的編譯和鏈接,被make工具解析并完成相關動作 make: 工程管理工具 語法: 要生成的文件:依賴的所有文件 時間戳: 編譯文件時,時間戳更新的文件需要重新加入編譯,時間戳沒有改變的不需要重新編譯 app:main.c add.c sub.c …

如何追查一個packet在linux 系統哪里丟失

要想追一個包在系統哪里丟失了, 就要了解 一個應用層的包在送出時 要經歷那些 檢查點 和被丟掉的點。 1. 在傳輸層,如果是 tcp 包 會有contrack 的 buf 的限制 可能會導致 packets 的丟失。 > 檢查辦法:查看dmesg日志有報錯:k…

MySQL數據庫慢查詢日志、SQL分析、數據庫診斷

1 數據庫調優維度 業務需求:勇敢地對不合理的需求說不系統架構:做架構設計的時候,應充分考慮業務的實際情況,考慮好數據庫的各種選擇(讀寫分離?高可用?實例個數?分庫分表?用什么數據庫?)SQL及索引:根據需求編寫良…

C# 實體更新記錄:如何捕獲和記錄字段變化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 簡稱BB)是一種求解整數規劃問題的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;詳解與Python代碼示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 簡稱B&B&#xff09;是一種求解整數規劃問題的有效算法。它結合了搜索與迭代的思想&#xff0c;通過系統地枚舉候選解來尋找最優解。在…

Java Web常見框架尋找路由技巧

在Java Web代碼審計中&#xff0c;尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller&#xff0c;其作為MVC架構中的一個組件&#xff0c;可以說是每個用戶交互的入口點。簡單介紹下Java Web中常見框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模塊化語法

目錄 一、use 1、命名空間 2、私有變量 3、用with改變模塊中的默認值 二、forward 1、給forward模塊起別名&#xff0c;讓成員加前綴 2、利用hide or show手動控制成員的可訪問性 三、import 1、不存在命名空間&#xff0c;成員變量在import之后直接公開 2、可以在嵌…

springboot防止重復提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表單重復提交有多種策略&#xff0c;以下是幾種常見且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按鈕&#xff1a;在表單提交后&#xff0c;使用JavaScript立即禁用提交按鈕&#xff0c;防止用戶再次點擊。響應式提示&#x…

十、Java集合 ★ ?(模塊18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比較器排序、Collections、可變參數、Map】

day05 泛型,數據結構,List,Set 今日目標 泛型使用 數據結構 List Set 1 泛型 1.1 泛型的介紹 ★ 泛型是一種類型參數&#xff0c;專門用來保存類型用的 最早接觸泛型是在ArrayList&#xff0c;這個E就是所謂的泛型了。使用ArrayList時&#xff0c;只要給E指定某一個類型…

講真,現在留給2024年下半年軟考的時間還夠嗎?

常識是個好東西&#xff0c;但是有時候卻容易蒙蔽咱們的雙眼&#xff0c;就拿下半年軟考而言&#xff0c;看起來現在才7月份&#xff0c;剛剛入伏&#xff0c;考試要到11月份&#xff0c;是冬天呢&#xff0c;中間還隔了一個完整的秋季&#xff0c;常識感覺還很遙遠&#xff0c…

【Vue3】4個比較重要的設計模式!!

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 在我投身于前端開發的職業生涯期間,曾有一次承接了一個大型項目的維護工作。此項目運用的是 Vue 框架,然而其代碼結構紊亂不堪,可維護性極度糟糕??。 這使我深刻領會到,理解并運用 Vue 中的重要設計模式是何等關鍵! …

對LinkedList ,單鏈表和雙鏈表的理解

一.ArrayList的缺陷 二.鏈表 三.鏈表部分相關oj面試題 四.LinkedList的模擬實現 五.LinkedList的使用 六.ArrayList和LinkedList的區別 一.ArrayList的缺陷: 1. ArrayList底層使用 數組 來存儲元素&#xff0c;如果不熟悉可以來再看看&#xff1a; ArrayList與順序表-CSDN…

一些常見的網絡故障

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ??寶劍鋒從磨礪出&#xff0c;梅花香自苦寒來 ??運維工程師的職責&#xff1a;監…

【數據分析】Python數據分析實戰:從零開始構建數據管道

Python數據分析實戰&#xff1a;從零開始構建數據管道 引言一、數據獲取二、數據清洗三、數據分析四、數據可視化五、案例研究&#xff1a;預測股票價格結論 我嘗試訪問您所提供的鏈接&#xff0c;但似乎該鏈接指向的內容已失效或被移除&#xff0c;因此無法直接獲取并閱讀該文…

【iOS】——ARC源碼探究

一、ARC介紹 ARC的全稱Auto Reference Counting. 也就是自動引用計數。使用MRC時開發者不得不花大量的時間在內存管理上&#xff0c;并且容易出現內存泄漏或者release一個已被釋放的對象&#xff0c;導致crash。后來&#xff0c;Apple引入了ARC。使用ARC&#xff0c;開發者不再…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查殼&#xff0c;本題是32位&#xff0c;有殼&#xff0c;進行脫殼。 第二步 這里的 jnz 指令會實現一個跳轉&#xff0c;并且下面的0EC85D78Bh被標紅了&#xff0c;應該是一個不存在的地址&#xff0c;這些東西就會導致IDA無法正常反匯編出原始代碼&#xff0c;也稱…

中文科技核心論文發表

中文科技核心論文題目如下&#xff1a; 1.混凝土結構用纖維增強塑料筋的耐久性評述&#xff1a;適合建筑、結構、材料等專業 2.建筑工程用阻燃塑料的研究進展&#xff1a;適合建筑、材料專業 3.纖維增強熱塑性塑料在面部護具中的應用研究&#xff1a;適合化工、醫學、材料等專…

springcloud2021.x使用nacos做配置中心

spirngcloud2021.0.5使用nacos做配置中心遇到的問題 環境 jdk1.8&#xff0c;spring-boot 2.6.13&#xff0c;spring-cloud-alibaba 2021.0.5.0 &#xff0c;spring-cloud 2021.0.5 方案一 application.properties # Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts…

C++中的condition_variable:條件變量

理解 C 中的條件變量&#xff08;Condition Variable&#xff09; 在多線程編程中&#xff0c;我們常常需要一個線程等待某個條件的變化&#xff0c;比如等待數據的生成或某個標志位的設置。如果沒有條件變量&#xff08;condition_variable&#xff09;&#xff0c;線程可能會…

啟智暢想火車類集裝箱號碼識別技術,軟硬件解決方案

集裝箱號碼識別需求&#xff1a; 實時檢測車皮號、火車底盤號碼、集裝箱號碼&#xff0c;根據火車類型分為以下三種情況&#xff1a; 1、純車皮&#xff0c;只檢測車皮號&#xff1b; 2、火車拉貨箱&#xff08;半車皮&#xff09;&#xff0c;檢測車皮號集裝箱號碼&#xff1b…