溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Thinkphp事件機制如何實現(xiàn)

發(fā)布時間:2022-09-22 09:43:17 來源:億速云 閱讀:161 作者:iii 欄目:開發(fā)技術

這篇“Thinkphp事件機制如何實現(xiàn)”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Thinkphp事件機制如何實現(xiàn)”文章吧。

    事件機制的實現(xiàn)有兩種途徑:通過監(jiān)聽、通過訂閱

    一、通過監(jiān)聽

    1、創(chuàng)建監(jiān)聽類:在命令行模式下進入框架根目錄執(zhí)行

    php think make:listener <自定義的類名>

    例如:

    php think make:listener UserListener

    執(zhí)行之后將在<框架根目錄>\app\listener\下生成UserListener這個類。

    2、配置監(jiān)聽:在<框架根目錄>\app\event.php這個文件的listen數(shù)組中配置UserListener這個類,如下:

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

    3、觸發(fā)監(jiān)聽:在你需要觸發(fā)監(jiān)聽的地方加入如下代碼

    event('testEvent');

    注意:這里的參數(shù)testEvent即為事件名稱,可隨便定義,但必須要與在event.php文件里配置的鍵名一致。

    觸發(fā)監(jiān)聽時你可以帶上第二個參數(shù)。通過第二個參數(shù)你可以把任何數(shù)據(jù)傳遞到UserListener這個類中,也就是handle方法的參數(shù)(不明白啥意思的結合下面的完整代碼理解)。

    4、處理監(jiān)聽邏輯:在UserListener類的handle方法中完成業(yè)務邏輯

    完整代碼如下

    Other:一個用來測試的類

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

    Index:觸發(fā)監(jiān)聽的類

    <?php
    namespace app\controller;
    use app\BaseController;
    class Index extends BaseController
    {
        public $name  = 'index';
        public function test1()
        {
            //觸發(fā)監(jiān)聽事件,無參數(shù)
            event('testEvent');
        }
        public function test2()
        {
            //觸發(fā)監(jiān)聽事件,傳遞字符串
            event('testEvent', 'hello');
        }
        public function test3()
        {
            //觸發(fā)監(jiān)聽事件,傳遞自身類
            event('testEvent', $this);
        }
        public function test4()
        {
            //觸發(fā)監(jiān)聽事件,傳遞其他類
            $other  = new Other();
            event('testEvent', $other);
        }
    }

    UserListener:事件監(jiān)聽類

    <?php
    namespace app\listener;
    class UserListener
    {
        /**
         * 事件監(jiān)聽處理
         *
         * @return mixed
         */
        public function handle($event)
        {
            //當調(diào)用Index類的test1方法時該代碼有效,$event為null
            var_dump($event);
            //當調(diào)用Index類的test2方法時該代碼有效,$event為字符串hello
            var_dump($event);
            //當調(diào)用Index類的test3方法時該代碼有效,$event為Index類的實例
            //可以訪問Index類的name變量
            echo $event->name;
            //當調(diào)用Index類的test4方法時該代碼有效,$event為Other類的實例
            //可以調(diào)用Other類的hello方法
            echo $event->hello();
        }
    }

    二、通過訂閱

    1、創(chuàng)建訂閱類

    在命令行模式下進入框架根目錄執(zhí)行

    php think make:subscribe <自定義的類名>

    例如:

    php think make:subscribe UserSubscribe

    執(zhí)行之后將在<框架根目錄>\app\subscribe\下生成UserSubscribe這個類。

    2、配置監(jiān)聽

    在<框架根目錄>\app\event.php這個文件的subscribe數(shù)組中配置UserSubscribe這個類,如下:

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

    注意:為了測試效果,要把上面配置的UserListener從listen數(shù)組刪除掉

    3、觸發(fā)監(jiān)聽

    跟第一種途徑一樣

    4、處理監(jiān)聽邏輯

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

    4.1 自動綁定

    在UserSubscribe類中添加ontestEvent方法,在該方法中完成業(yè)務邏輯。添加的方法名不能隨意定義,規(guī)則是事件名稱前面加上on。因為我們在event.php里定義的事件名稱是testEvent,所以方法名就是ontestEvent(注意大小寫)。監(jiān)聽方法定義之后就自動與事件綁定,所以我稱之為自動綁定。

    完整代碼如下

    Other和Index類的代碼跟第一種途徑一樣

    UserSubscribe:事件訂閱類

    <?php
    namespace app\subscribe;
    class UserSubscribe
    {
        public function ontestEvent($user)
        {
            //當調(diào)用Index類的test1方法時該代碼有效,$event為null
            var_dump($user);
            //當調(diào)用Index類的test2方法時該代碼有效,$event為字符串hello
            var_dump($user);
            //當調(diào)用Index類的test3方法時該代碼有效,$event為Index類的實例
            //可以訪問Index類的name變量
            echo $user->name;
            //當調(diào)用Index類的test4方法時該代碼有效,$event為Other類的實例
            //可以調(diào)用Other類的hello方法
            echo $user->hello();
        }
    }
    4.2 手動綁定

    首先,創(chuàng)建事件類,負責處理具體的業(yè)務邏輯。在命令行模式下進入框架根目錄執(zhí)行:

    php think make:event <自定義的類名>

    例如:

    php think make:event UserEvent

    執(zhí)行之后將在<框架根目錄>\app\event\下生成UserEvent這個類。

    再在該類中定義一個handle方法,該方法有一個傳入?yún)?shù)。方法名和傳入的參數(shù)名可以任意定義。具體的業(yè)務邏輯就可以放在handle方法里面處理。

    然后,在UserSubscribe類中添加subscribe方法,該方法傳入?yún)?shù)為 Event 對象。然后在該方法中將監(jiān)聽的事件綁定到UserEvent類的handle方法上。如下:

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

    完整代碼如下

    Other和Index類的代碼跟第一種途徑一樣

    UserSubscribe:事件訂閱類

    <?php
    declare (strict_types = 1);
    namespace app\subscribe;
    use think\Event;
    class UserSubscribe
    {
        public function subscribe(Event $event)
        {
            $event->listen('testEvent', [app('app\event\UserEvent'), 'handle']);
        }
    }

    UserEvent:事件處理類

    <?php
    declare (strict_types = 1);
    namespace app\event;
    class UserEvent
    {
        public function handle($user)
        {
            //當調(diào)用Index類的test1方法時該代碼有效,$user為null
            var_dump($user);
            //當調(diào)用Index類的test2方法時該代碼有效,$user為字符串hello
            var_dump($user);
            //當調(diào)用Index類的test3方法時該代碼有效,$user為Index類的實例
            //可以訪問Index類的name變量
            echo $user->name;
            //當調(diào)用Index類的test4方法時該代碼有效,$user為Other類的實例
            //可以調(diào)用Other類的hello方法
            echo $user->hello();
        }
    }

    以上就是關于“Thinkphp事件機制如何實現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI