天天看點

TP6 事件綁定、監聽、訂閱

  1. 事件綁定與監聽
  • 指令行生成事件類 php think make:event EventDemo
  • 指令行生成事件監聽類php think make:listener ListenerDemo

事件類可作為儲存與事件相關資訊的容器,如沒有額外需求可以不需要定義

事件系統的所有操作都通過thinkfacadeEvent類進行靜态調用

  • 當定義事件類時
 // 在event.php中綁定事件辨別
'bind' => [
     'EventDemo' => appeventEventDemo::class
 ],
// 一個事件可以有很多不相關的監聽器  
'listen' => [
   'EventDemo' => [
       applistenerListenerDemoA::class,
       applistenerListenerDemoB::class
   ]
],

// 或者可以這樣動态綁定
Event::bind(['EventDemo' => appeventEventDemo::class]);

// 以下方式都可以觸發事件
Event::trigger('EventDemo');
Event::trigger(appeventEventDemo::class);
Event::trigger(new appeventEventDemo('EventDemo 初始化'));
           
  • 不定義事件類時
'bind' => [
     
 ],

'listen' => [
   'EventDemo' => [
       applistenerListenerDemoA::class,
       applistenerListenerDemoB::class
   ]
],

// 以下方式觸發事件
Event::trigger('EventDemo');
           

此時就覺得bind比較多餘,怎麼說

// 定義了事件類可以這樣綁定
'bind' => [
     
  ],

'listen' => [
    appeventEventDemo::class => [
        applistenerListenerDemoA::class,
        applistenerListenerDemoB::class
    ]
]


// 這樣就可以觸發事件
Event::trigger(appeventEventDemo::class);
Event::trigger(new appeventEventDemo('EventDemo 初始化'));

// 這麼看來bind的作用也隻能展現在前面寫到的那樣了
           
  1. 事件訂閱
可以通過事件訂閱機制,在一個監聽器中監聽多個事件

指令行生成事件訂閱者類php think make:subscribe SubscribeDemo

訂閱者類其實就是監聽器的一個集合,在裡面可以監聽多個事件

<?php
declare (strict_types = 1);

namespace appsubscribe;

use thinkEvent;
use thinkfacadeLog;

class SubscribeDemo
{
   /**
    * 命名規範是on + 事件辨別(駝峰命名)
    */
   public function onEventInit($event)
   {
       // EventInit事件響應處理
       Log::info('EventInit事件響應處理');
   }

   public function eventEnd($event)
   {
       // EventEnd事件響應處理
       Log::info('EventEnd事件響應處理');
   }

   /**
    * 也可以通過subscribe方法來自定義事件辨別注冊事件監聽器
    */
   public function subscribe(Event $event)
   {
       $event->listen('EventEnd',[$this,'eventEnd']);
   }

}
           

編寫好事件訂閱者類後在event.php中注冊事件訂閱者

'subscribe'    =>    [
       appsubscribeSubscribeDemo::class,
        // 更多事件訂閱
    ],
           

或者動态注冊

Event::subscribe(appsubscribeSubscribeDemo::class);
           

注冊後就可以通過以下方式觸發事件

Event::trigger('EventInit');
// 通過助手函數
event('EventEnd');