搜尋
首頁php框架ThinkPHPThinkphp事件機制如何實現

Thinkphp事件機制如何實現

Jun 02, 2023 pm 05:37 PM
thinkphp

    事件機制的實作有兩種途徑:透過監聽、透過訂閱

    #一、透過監聽

    1、建立監聽類:在命令列模式下進入框架根目錄執行

    php think make:listener

    例如:

    php think make:listener UserListener

    執行之後將在\app\listener\下產生UserListener這個類。

    2、設定監聽:在\app\event.php這個檔案的listen陣列中設定UserListener這個類,如下:

    'listen' => [
        'testEvent' => ['app\listener\UserListener']
    ],

    3、觸發監聽:在你需要觸發監聽的地方加入如下程式碼

    event('testEvent');

    注意:這裡的參數testEvent即為事件名稱,可隨便定義,但必須與在event.php檔案裡配置的鍵名一致。

    觸發監聽時你可以帶第二個參數。透過第二個參數你可以把任何資料傳遞到UserListener這個類別中,也就是handle方法的參數(不明白啥意思的結合下面的完整程式碼理解)。

    4、處理監聽邏輯:在UserListener類別的handle方法中完成業務邏輯

    #完整程式碼如下

    Other:一個用來測試的類別

    <?php
    namespace app\controller;
    class Other
    {
        public function hello()
        {
            echo &#39;hello function&#39;;
        }
    }

    Index:觸發監聽的類別

    UserListener:事件監聽類別

    <?php
    namespace app\listener;
    class UserListener
    {
        /**
         * 事件监听处理
         *
         * @return mixed
         */
        public function handle($event)
        {
            //当调用Index类的test1方法时该代码有效,$event为null
            var_dump($event);
            //当调用Index类的test2方法时该代码有效,$event为字符串hello
            var_dump($event);
            //当调用Index类的test3方法时该代码有效,$event为Index类的实例
            //可以访问Index类的name变量
            echo $event->name;
            //当调用Index类的test4方法时该代码有效,$event为Other类的实例
            //可以调用Other类的hello方法
            echo $event->hello();
        }
    }

    二、透過訂閱

    1、建立訂閱類別

    #在命令行模式下進入框架根目錄執行

    php think make:subscribe

    例如:

    #php think make:subscribe UserSubscribe

    執行之後將在\app\subscribe\下產生UserSubscribe這個類別。

    2、設定監聽

    在\app\event.php這個檔案的subscribe陣列中配置UserSubscribe這個類,如下:

    'subscribe' => ['app\subscribe\UserSubscribe'],

    注意:為了測試效果,要把上面設定的UserListener從listen陣列刪除掉

    # 3.觸發監聽

    跟第一種途徑一樣

    4、處理監聽邏輯

    處理監聽的邏輯又有兩種方法,我稱之為自動綁定和手動綁定。手動綁定和自動綁定是互斥的,只能二選一。

    4.1 自動綁定

    完成業務邏輯的ontestEvent方法應該要加入到UserSubscribe類別中。新增的方法名稱不能隨意定義,規則是事件名稱前面加上on。因為我們在event.php裡定義的事件名稱是testEvent,所以方法名稱就是ontestEvent(注意大小寫)。監聽方法定義之後就會自動與事件綁定,所以我稱之為自動綁定。

    完整程式碼如下

    Other和Index類別的程式碼跟第一種途徑一樣

    UserSubscribe:事件訂閱類別

    <?php
    namespace app\subscribe;
    class UserSubscribe
    {
        public function ontestEvent($user)
        {
            //当调用Index类的test1方法时该代码有效,$event为null
            var_dump($user);
            //当调用Index类的test2方法时该代码有效,$event为字符串hello
            var_dump($user);
            //当调用Index类的test3方法时该代码有效,$event为Index类的实例
            //可以访问Index类的name变量
            echo $user->name;
            //当调用Index类的test4方法时该代码有效,$event为Other类的实例
            //可以调用Other类的hello方法
            echo $user->hello();
        }
    }
    4.2 手動綁定

    首先,建立事件類,負責處理特定的業務邏輯。在命令列模式下進入框架根目錄執行:

    php think make:event

    例如:

    php think make:event UserEvent

    執行之後將在\app\event\下產生UserEvent這個類別。

    再在該類別中定義一個handle方法,該方法有一個傳入參數。方法名和傳入的參數名可以任意定義。具體的業務邏輯就可以放在handle方法裡面處理。

    接下來,在UserSubscribe類別裡面新增subscribe方法,方法需要接收一個Event物件作為參數。接著,在該函數裡將事件監聽綁定到UserEvent類別的handle方法上。如下:

    $event->listen(&#39;testEvent&#39;, [app(&#39;app\event\UserEvent&#39;), &#39;handle&#39;]);

    完整程式碼如下

    Other和Index類別的程式碼跟第一種途徑一樣

    UserSubscribe:事件訂閱類別

    UserEvent:事件處理類別

    <?php
    declare (strict_types = 1);
    namespace app\event;
    class UserEvent
    {
        public function handle($user)
        {
            //当调用Index类的test1方法时该代码有效,$user为null
            var_dump($user);
            //当调用Index类的test2方法时该代码有效,$user为字符串hello
            var_dump($user);
            //当调用Index类的test3方法时该代码有效,$user为Index类的实例
            //可以访问Index类的name变量
            echo $user->name;
            //当调用Index类的test4方法时该代码有效,$user为Other类的实例
            //可以调用Other类的hello方法
            echo $user->hello();
        }
    }

    以上是Thinkphp事件機制如何實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    MantisBT

    MantisBT

    Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用