<p>Hyperf 模型事件监听基于 PSR-14 事件总线,监听 Hyperf\Database\Events* 下的原生事件;常用 StatementExecuted/QueryExecuted 捕获 SQL 写操作,通过正则匹配 SQL 类型;事务事件 TransactionBeginning/Committed/RolledBack 适用于事务边界控制;推荐 @Listener 注解注册;SQL 与 bindings 可反推模型信息,精确模型实例建议业务层 dispatch 自定义事件。</p>

Hyperf 的模型事件监听不依赖 Laravel 风格的静态钩子(如 creating、saving),而是基于 PSR-14 标准的事件总线机制,配合数据库底层触发的原生事件类实现。核心在于监听 Hyperf\Database\Events\* 下的预定义事件,而非直接在模型里写回调。
监听 SQL 执行类事件(含增删改)
所有数据库操作(INSERT/UPDATE/DELETE/SELECT)都会触发 StatementExecuted 或 QueryExecuted。这是最常用、最可靠的模型“写入”监听入口:
- 使用
Hyperf\Database\Events\StatementExecuted:包含原始 SQL、绑定参数、执行耗时,适合日志记录、慢查询捕获 - 使用
Hyperf\Database\Events\QueryExecuted:更轻量,不含参数解析,适合简单审计 - 监听器中通过
$event->sql判断是否为写操作,例如匹配^INSERT\b|^UPDATE\b|^DELETE\b(注意大小写和词边界)
监听事务生命周期事件
当业务明确包裹在事务中时,可监听事务级事件来感知模型批量变更的边界:
-
TransactionBeginning:事务开始,适合初始化上下文或标记批次 ID -
TransactionCommitted:事务成功提交,可在此触发最终通知、缓存刷新等强一致性操作 -
TransactionRolledBack:事务回滚,用于清理临时状态或发送告警 - 注意:单条模型 save() 若未显式开启事务,默认不触发这些事件
用注解方式快速注册监听器
无需修改 config/autoload/listeners.php,推荐使用 @Listener 注解自动注册:
- 在监听器类顶部添加
@Listener(来自Hyperf\Event\Annotation\Listener) -
listen()方法返回要监听的事件类数组,支持多个事件(如同时监听StatementExecuted和TransactionCommitted) - 确保类已正确命名空间并位于
app/Listener/下,Hyperf 启动时会自动扫描加载
区分读写、提取模型信息的小技巧
原生事件不带模型实例,但可通过 SQL 和参数反推影响的模型:
- 解析
$event->sql获取表名(如INSERT INTO users→ 推断为User模型) - 结合
$event->bindings提取主键值或关键字段,用于后续关联查询或日志标注 - 若需精确模型实例,建议在业务层显式 dispatch 自定义事件(如
UserCreated),由模型方法内部触发,保持语义清晰










