TP6起事件系统彻底重构:TP5用Hook静态类,TP6/8改用观察者模式,支持事件类、自动绑定、类型提示;event()函数仅TP6+存在;配置须放app/event.php而非config/;监听器方法必须为handle($event)单参数。

你需要把旧项目从ThinkPHP 5.x升级到6.x或8.x,但发现event()函数突然报错、监听器不触发、配置文件找不到——这不是代码写错了,是事件系统底层机制彻底重构了。
TP5和TP6事件系统根本区别在哪
TP5用的是Hook机制,核心是 hinkHook静态类;TP6起改用真正的事件系统,基于观察者模式,支持事件类、监听器自动绑定、类型提示和容器注入。
TP5里写event('UserLogin')必然Fatal error:Call to undefined function,因为这个函数压根不存在;TP6才首次引入event()助手函数和thinkacadeEvent门面类。
TP5注册监听必须在应用初始化早期手动调用 hinkHook::add('user_login', [...]),而TP6监听器必须在app/event.php中声明,运行时无法动态追加。
立即学习“PHP免费学习笔记(深入)”;
【TP5的Hook不读config/event.php,TP6的event.php必须放在app目录下,放错位置监听器永远不生效】
TP6事件配置三步到位
第一步:在项目根目录下的app文件夹里新建event.php文件(不是config/event.php)。
第二步:填入标准配置格式,例如:
return [
'listen' => [
'UserLogin' => ['applistenerSendNotification', 'applistenerRecordLoginLog'],
],
];
第三步:确保监听器类方法签名统一为public function handle($event),不能再写handle($uid, $ip)这种多参数形式——否则触发时直接抛出InvalidArgumentException。
TP8新增的三种事件注册方式
方法一:事件绑定(bind)——适合一对一强关联场景
在app/event.php中写:
'bind' => [
'app\event\UserLogin' => ['app\listener\SendNotification'],
],
方法二:事件监听(listen)——最常用,支持通配符
例如监听所有后台事件:
'app\admin\event\*' => ['app\admin\listener\AdminActionLog'],
方法三:事件订阅(subscribe)——把多个相关事件收拢到一个类里管理
配置项写'subscribe' => ['app\subscribe\UserSubscribe'],然后在UserSubscribe类中实现getSubscribedEvents()方法返回事件映射数组。
这一步操作起来很简单,直接把文件拖进去就行。



















