什么是事件
Laravel 的事件系统实现了简单的观察者模式。 在应用中触发(dispatch)事件,再定义响应这些事件的监听器,可以把组件间的耦合降到最小。 例如触发「订单已确认」事件后,「发送确认邮件」「减少库存」「向 Slack 通知」等多个监听器可以独立运行。 订单处理代码完全不需要知道邮件或 Slack 的实现。事件类放在
app/Events,监听器放在 app/Listeners。
目录不存在时 Artisan 命令会自动创建。生成事件与监听器
注册事件
事件自动发现
默认情况下,Laravel 会扫描app/Listeners 自动注册监听器。
它会读取 handle 或 __invoke 方法的参数类型来推断事件映射。
bootstrap/app.php 中额外指定扫描位置:
手动注册
也可以在AppServiceProvider 的 boot 中通过 Event 门面手动注册:
定义事件
事件类是数据的容器,不含逻辑,只以属性形式承载信息:SerializesModels trait 让排队的监听器在序列化事件时能正确处理 Eloquent 模型。
触发事件
使用dispatch 静态方法或 event() 辅助函数触发事件:
事务提交后触发
若希望仅在数据库事务提交后触发,让事件类实现ShouldDispatchAfterCommit。
事务失败则事件会被丢弃:
编写监听器
监听器通过handle 方法接收事件。构造器中的依赖由服务容器自动注入:
handle 方法返回 false 可以阻止事件继续传给后续监听器。
排队监听器
发送邮件、发起 HTTP 请求等耗时操作可以作为排队监听器异步执行。 只需实现ShouldQueue,事件触发时监听器会自动入队。
使用排队监听器前需配置队列并启动 worker。详见队列与任务。
自定义队列连接 / 名称 / 延迟
用 PHP 属性设置:最大重试次数与超时
用#[Tries]、#[Timeout] 控制失败行为:
失败处理
定义failed 方法处理超过最大重试仍失败的情况:
事件订阅者
事件订阅者用来把相关的多个事件处理器组织在一个类中。创建订阅者
subscribe 方法返回事件与处理函数的映射数组:
注册订阅者
若启用事件自动发现,返回数组的subscribe 会被自动注册。
手动注册在 AppServiceProvider::boot 中调用 Event::subscribe:
实践示例:用户注册时发送欢迎邮件
1
创建事件类
app/Events/UserRegistered.php 添加用户属性:2
创建监听器
ShouldQueue,让发邮件异步处理:3
在控制器中触发
在用户注册后调用 控制器只负责触发事件,不关心邮件发送的实现。
未来若要加上 Slack 通知,控制器无需改动。
UserRegistered::dispatch():4
启动 worker