日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

      一、通過監聽

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

      完成業務邏輯的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('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事件機制如何實現的詳細內容,更多請關注www.xfxf.net其它相關文章!

分享到:
標簽:thinkphp
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定