Hyperf事件驱动编程基于“发布-订阅”机制,核心步骤为:一、定义携带数据的事件类;二、创建带#[Listener]注解的监听器并实现listen()与process();三、通过EventDispatcherInterface::dispatch()分发事件;四、检查注解、命名空间、文件路径及组件加载确保生效。

Hyperf 事件驱动编程的核心是“发布-订阅”机制,不写硬依赖、不改主流程,就能让注册、登录、下单等动作自动触发邮件、短信、日志、通知等后续操作。入门关键就三点:定义事件、写监听器、在业务中分发。
一、定义一个事件类
事件本质是一个携带数据的普通 PHP 类,放在 app/Event/ 目录下。建议属性设为 public,方便监听器直接读取:
- 比如用户注册成功后要通知多个模块,新建
UserRegistered.php:
namespace App\Event;<br>class UserRegistered<br>{<br> public int $userId;<br> public string $email;<br><br> public function __construct(int $userId, string $email)<br> {<br> $this->userId = $userId;<br> $this->email = $email;<br> }<br>}
二、创建监听器处理事件
监听器负责响应特定事件,放在 app/Listener/ 目录。用命令快速生成:
php bin/hyperf.php gen:listener SendEmailListenerphp bin/hyperf.php gen:listener SendSmsListener
修改监听器中的 listen() 方法,声明它监听哪个事件;在 process() 中写具体逻辑:
-
listen()返回数组,可同时监听多个事件,例如:return [UserRegistered::class]; -
process()参数类型提示写清楚,如public function process(UserRegistered $event): void - 监听器默认自动注册,无需手动绑定
三、在控制器或服务中分发事件
只要调用 Hyperf\Event\Contract\EventDispatcherInterface 的 dispatch() 方法即可触发所有监听器:
- 推荐通过构造函数注入:
public function __construct(protected EventDispatcherInterface $eventDispatcher) {} - 在注册逻辑完成后执行:
$this->eventDispatcher->dispatch(new UserRegistered($id, $email)); - 事件分发是同步的,但你可以配合协程或消息队列实现异步解耦(进阶用法)
四、验证与调试小技巧
刚上手时最容易卡在监听器没生效,检查这几处:
- 确认监听器类顶部有
#[Listener]注解 - 确保
listen()返回的事件类名和实际定义的类完全一致(含命名空间) - 监听器文件名、类名、路径要匹配规范(如
SendEmailListener.php→SendEmailListener类) - 运行
php bin/hyperf.php vendor:publish --force确保事件组件已正确加载(首次使用或升级后)










