ThinkPHP 6.1+ 模型事件必须通过观察者类注册,废弃的 protected function saved() 等魔术方法不再触发;需在 initialize() 中调用 self::observe('app\observe\UserObserver'),方法名用小驼峰如 updated,并注意命名空间、大小写及软删除适配。

ThinkPHP 6.1+ 起模型事件(如 saved、deleting)不再通过魔术方法自动触发,必须改用观察者类(Observer)显式注册。不是代码写错了,是框架底层机制已重构。
确认是否用了已废弃的旧写法
检查模型中是否还存在类似这样的方法:
protected function saved() { ... }protected function deleting() { ... }
这类写法在 TP6.1+ 中完全不执行。框架已移除对这些魔术方法的监听逻辑,即使方法存在也不会被调用。
正确创建并注册观察者类
新建一个观察者类,例如 app\observe\UserObserver.php:
立即学习“PHP免费学习笔记(深入)”;
- 方法名必须是标准小驼峰格式:
created、updated、deleted、restored(注意不是onUpdated或afterUpdate) - 在模型的
initialize()静态方法中注册:self::observe('app\observe\UserObserver'); - 路径需完整且反斜杠要转义(Windows 下也建议统一用正斜杠或双反斜杠)
排查四类高频失效原因
90% 的“不触发”问题出在基础配置上:
-
注册位置错误:不能放在
__construct()或普通方法里,必须在initialize()中调用observe() -
命名空间或文件名大小写不符:Linux 环境下
UserObserver.php和userobserver.php是两个不同文件 -
方法名拼写错误:比如写了
update(少 d)或Updated(首字母大写),实际只认updated -
软删除场景未适配:若模型启用了软删除但没实现
SoftDeletetrait,deleted不会触发,应改用forceDeleted监听强制删除
临时验证是否走通事件链
在观察者方法开头加一句日志或异常,快速判断是否进入:
Log::info('user.updated triggered', ['id' => $model->id]);- 或
throw new \Exception('observer hit');(配合APP_DEBUG=true查看是否抛出)
如果没日志也没异常,说明注册失败;如果有,则问题在业务逻辑内。



















