如何配置ThinkPHP事件监听机制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1123个文字,预计阅读时间需要5分钟。
许多人在配置了`listen`后没有响应,是因为漏写了`bind`或写错了位置。ThinkPHP 6+的事件机制默认走的是事件标识 -> 事件类 -> 监听器的链路,而不是直接通过字符串对字符串。
-
bind是把一个事件标识(字符串)映射到具体事件类,比如'user_registered' => \app\event\UserRegistered::class;不定义bind也能用字符串触发,但无法传递类型化参数 -
listen是把事件类(或标识)和监听器类关联起来,支持数组形式注册多个监听器:\app\event\UserRegistered::class => [\app\listener\SendWelcomeEmail::class, \app\listener\LogRegistration::class] - 如果只用字符串触发(如
event('user_registered', $data)),bind可省略,但监听器handle()方法接收的是原始$data,不是封装好的事件对象 - 配置里别混用命名空间缩写和完整类名——
'user_registered' => 'SendWelcomeEmail'这种写法在 TP6.3+ 已不支持,必须写全路径\app\listener\SendWelcomeEmail::class
监听器 handle() 方法参数类型怎么判断
参数类型完全由你触发事件的方式决定,不是框架自动推断的。
本文共计1123个文字,预计阅读时间需要5分钟。
许多人在配置了`listen`后没有响应,是因为漏写了`bind`或写错了位置。ThinkPHP 6+的事件机制默认走的是事件标识 -> 事件类 -> 监听器的链路,而不是直接通过字符串对字符串。
-
bind是把一个事件标识(字符串)映射到具体事件类,比如'user_registered' => \app\event\UserRegistered::class;不定义bind也能用字符串触发,但无法传递类型化参数 -
listen是把事件类(或标识)和监听器类关联起来,支持数组形式注册多个监听器:\app\event\UserRegistered::class => [\app\listener\SendWelcomeEmail::class, \app\listener\LogRegistration::class] - 如果只用字符串触发(如
event('user_registered', $data)),bind可省略,但监听器handle()方法接收的是原始$data,不是封装好的事件对象 - 配置里别混用命名空间缩写和完整类名——
'user_registered' => 'SendWelcomeEmail'这种写法在 TP6.3+ 已不支持,必须写全路径\app\listener\SendWelcomeEmail::class
监听器 handle() 方法参数类型怎么判断
参数类型完全由你触发事件的方式决定,不是框架自动推断的。

