- 事件綁定與監聽
- 指令行生成事件類 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的作用也隻能展現在前面寫到的那樣了
- 事件訂閱
可以通過事件訂閱機制,在一個監聽器中監聽多個事件
指令行生成事件訂閱者類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');