亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Thinkphp事件機制如何實現

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

這篇“Thinkphp事件機制如何實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“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 'hello function';
        }
    }

    Index:觸發監聽的類

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

    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 自動綁定

    在UserSubscribe類中添加ontestEvent方法,在該方法中完成業務邏輯。添加的方法名不能隨意定義,規則是事件名稱前面加上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('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)
        {
            //當調用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事件機制如何實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

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

    AI

    申扎县| 哈巴河县| 湖口县| 湟中县| 平凉市| 甘泉县| 喀喇沁旗| 玉山县| 阿巴嘎旗| 通河县| 科技| 通渭县| 鱼台县| 南木林县| 新丰县| 响水县| 葵青区| 锡林浩特市| 临泽县| 抚顺市| 孟州市| 祁阳县| 彭阳县| 焉耆| 济阳县| 潜江市| 工布江达县| 喀什市| 体育| 隆德县| 离岛区| 尉犁县| 开阳县| 进贤县| 永泰县| 正蓝旗| 巴马| 湘乡市| 高阳县| 玛曲县| 长沙县|