模型事件不触发,八成是没注册、没启用或名字写错了——不是逻辑问题,是配置和调用链断了。

先从最常见的坑说起。很多开发者以为写好了模型事件方法,事件就会自动触发。实际上,ThinkPHP并不会自动去扫描你的类里有哪些事件方法,它需要你明确地告诉它“哪个方法要在哪个时机执行”。也就是说,你必须老老实实到 initialize() 里去注册。

ThinkPHP模型事件_model事件监听与触发回调【技巧】

模型事件必须在 initialize() 里显式注册

就算你把方法名写得一字不差,只要没注册,就是白搭。在模型类中定义 public static function initialize(),然后在里面调用 self::event() 才是正道。

afterSelect 拿不到 SQL 是设计使然,得提前抓

很多人查问题时会跑到 afterSelect 里去取 SQL 日志,结果发现返回的是空的。别慌,这不是 Bug。当 afterSelect 触发时,查询早就执行完了,PDO 结果已经返回,原始 SQL 字符串已经被丢弃。

事件名必须小写且严格匹配标准列表

从 TP6.1+ 开始,框架已经废弃了所有驼峰、on 前缀、大写首字母之类的写法。现在只认以下小写命名——注意没有 on,没有大写字母:

全局事件系统开关 app.event 必须为 true

所有模型事件都依赖底层的事件驱动框架。如果 app.event 被设为 false,整个事件链就会静默中断,连 observe() 这种观察者模式都不工作。

最容易被忽略的一点:模型事件是内存阶段的钩子,并不是数据库事务的提交点。举个例子,sa ved 事件触发的时候,事务还没有 commit,外部服务是查不到这条记录的。这一点在做审计日志或者异步通知的时候,稍不注意就会导致数据不一致——做实时业务时尤其要留个心眼。

本文转载于:https://www.php.cn/faq/2461195.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。