TP5 不支持在 common.php 中写事件监听,因其仅为函数容器、无事件实例且不参与调度;正确方式是定义事件类、配置 event.php 并手动调用 hinkEvent::trigger() 触发。

TP5 没有“函数文件写事件”这种标准概念——application/common.php 是纯函数集合,不支持注册事件监听或触发事件机制。真正处理事件必须用 TP5 内置的 thinkeventEvent 类,且需通过配置、类定义和手动触发三者配合。
为什么不能在 common.php 里直接写事件监听
common.php 在每次请求启动时被无条件 include,它只是全局函数容器,没有生命周期钩子,也不参与事件调度系统。你往里面写 $event->listen(...) 或 $event->trigger(...) 会报错,因为 $event 实例根本不存在,也未初始化。
正确写法:定义事件类 + 配置监听 + 手动触发
TP5 的事件是基于类的,不是函数式回调。必须满足三个条件:
- 定义一个事件类(如
appeventSendSms),类中必须有handle方法 - 在
application/event.php中声明监听关系:['sms_send' => ['app\event\SendSms']] - 在业务逻辑中调用
hinkEvent::trigger('sms_send', $data)触发
示例:app/event/SendSms.php
namespace appevent;
class SendSms
{
public function handle($data)
{
// 这里写发短信逻辑,$data 是 trigger 传入的参数
hinkLog::write('SMS to ' . $data['mobile'], 'event');
}
}
常见错误:混淆 Hook、Behavior 和 Event
很多人把 common.php 当成 Laravel 的 EventServiceProvider,试图在里面绑定监听器,结果:
- 写
hinkEvent::listen('xxx', function(){})→ 报错:Call to undefined method(TP5 不支持闭包监听) - 在
common.php中 new 一个类并调用方法 → 不是事件,只是普通函数调用,无法解耦、不可配置、无法批量响应 - 误用 Behavior(行为)或 Hook(钩子)替代 Event → Behavior 只作用于控制器/模型生命周期,Hook 已在 TP5.1+ 废弃
扩展点:想让事件自动响应 HTTP 请求怎么办
TP5 本身不提供“HTTP 请求一来就自动触发某事件”的机制。若需要类似效果,必须手动在控制器中触发:
比如用户注册成功后发欢迎短信,不能靠配置自动触发,必须在 RegisterController::save() 末尾加一行: hinkEvent::trigger('user_registered', ['uid' => $id]);。漏掉这句,事件永远不会执行。
这个手动触发步骤极易被忽略,而且无法通过配置开关控制——它硬编码在业务逻辑里,这也是 TP5 事件系统最常被吐槽的隐性耦合点。

















