ThinkPHP6事件系统使用指南

109 阅读3分钟

本文由 ChatMoney团队出品

在ThinkPHP 6中,事件系统提供了一种优雅的方式来实现解耦和动态响应。你可以通过注册事件和对应的监听者来处理各种应用逻辑。

事件注册

闭包注册

闭包是最简单的事件监听者,可以直接在注册时定义。

Event::listen("ClosureEvent", function(){var_dump("ClosureEvent1");
});
Event::listen("ClosureEvent", function(){var_dump("ClosureEvent2");
});

静态方法 与普通方法注册

默认方法

首先定义一个事件类,并包含默认的处理方法。

 // app\admin\event\testEvent.phpclass testEvent{ // 默认方法public function handle(){var_dump("handle");
  }
}

然后在index.php中注册事件。

Event::listen("staticTest", "app\admin\event\testEvent");

自定义方法

你也可以为事件类定义多个方法,并在注册时指定。

 // app\admin\event\testEvent.php
class testEvent{
    public function commonTest1(){var_dump("commonTest1");
    }
    public function commonTest2(){var_dump("commonTest2");
    }
    public static function staticTest1(){var_dump("staticTest1");
    }
    public static function staticTest2(){var_dump("staticTest2");
    }
}    

index.php中按需注册这些方法。

Event::listen("staticTest", "app\admin\event\testEvent::staticTest1");
Event::listen("staticTest", "app\admin\event\testEvent::staticTest2");
Event::listen("commonTest", ["app\admin\event\testEvent", "commonTest1"]);
Event::listen("commonTest", ["app\admin\event\testEvent", "commonTest2"]);

批量注册

如果需要注册多个监听者,可以使用批量注册方法。

Event::listenEvents([
    "staticTest" => [
        "app\admin\event\testEvent::staticTest1",
        "app\admin\event\testEvent::staticTest2"],
    "commonTest" => [
        ["app\admin\event\testEvent", "commonTest1"],
        ["app\admin\event\testEvent", "commonTest2"],
  ],
]);

事件订阅者

手动订阅

在事件类中定义一个subscribe方法,手动添加监听者。

 // app\admin\event\testEvent.phpclass testEvent{
// ... 已有方法 ...
    public function subscribe(\think\Event $event){$event->listen("commonDefaultTest", "\app\admin\event\testEvent");
        $event->listen("commonTest", ["\app\admin\event\testEvent", "commonTest1"]);$event->listen("commonTest", ["\app\admin\event\testEvent", "commonTest2"]);
        $event->listen("staticTest", "\app\admin\event\testEvent::staticTest1");$event->listen("staticTest", "\app\admin\event\testEvent::staticTest2");
  }
}

index.php中订阅事件。

Event::subscribe(["app\admin\event\testEvent"]);

智能订阅

事件类的方法名遵循特定格式时,可以自动识别并订阅。

class testEvent{
    public function onCommonTest1(){
        var_dump("onCommonTest1");
    }
     public function onCommonTest2(){
        var_dump("onCommonTest2");
     }
}

触发事件时,方法名需大写。

Event::trigger("CommonTest1");
Event::trigger("CommonTest2");

调用事件

你可以使用trigger方法来调用事件。

Event::trigger("commonTest");
event("commonTest");

高级用法

添加到监听者头部

通过设置listen方法的第三个参数为true,可以将监听者添加到监听者列表的头部。

Event::listen("staticTest","app\admin\event\testEvent", true);

触发单个监听者

trigger方法的第三个参数设置为true时,如果有多个监听者,只触发第一个。

Event::trigger("CommonTest1", null, true);

移除事件

可以使用remove方法来移除特定的事件监听者。

Event::remove("staticTest");

别名

可以为事件定义别名,使得事件触发更加灵活。

Event::bind(["commonTest1" => "app\admin\event\testEvent"]);
Event::listen("commonTest1", ["app\admin\event\testEvent", "commonTest1"]);
Event::trigger("commonTest1");
Event::trigger("app\admin\event\testEvent");

检查事件是否存在

hasListener方法可以用来检查某个事件是否有监听者。

Event::hasListener("commonTest1");

关于我们

本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!