首頁 > php框架 > ThinkPHP > 主體

Thinkphp事件機制如何實現

PHPz
發布: 2023-06-02 17:37:22
轉載
858 人瀏覽過

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

    #一、透過監聽

    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(&#39;testEvent&#39;);
    登入後複製

    注意:這裡的參數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中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!