Laravel 的 events 和 listeners 实现了观察者模式 — 当发生重要事情时,你 dispatch 一个事件,然后一个或多个 listeners 对其做出反应。这将代码解耦:事件源不需要知道谁在响应,从而实现关注点的清晰分离。
定义事件和监听器
{
{}
}
{
{
::(->order->customer)->( (->order));
}
}
// when the order ships, DISPATCH the event — all listeners run
OrderShipped::dispatch($order);
// or: event(new OrderShipped($order));
Dispatching 事件会触发所有已注册的监听器。订单发货代码只是宣布发生了什么 — 它不知道(也不关心)是否有邮件、分析或其他响应在进行。
// one event can have MANY listeners — each a separate concern
OrderShipped → SendShipmentNotification // email
→ UpdateInventory // adjust stock
→ RecordAnalytics // log the event
// add reactions without modifying the order-shipping code
这是关键好处:你可以添加新的响应(一个监听器)到事件,而无需触及 dispatch 事件的代码 — 这是干净、可扩展的解耦。
class SendShipmentNotification implements ShouldQueue { // run the listener in the BACKGROUND
public function handle(OrderShipped $event): void { ... }
}
实现 ShouldQueue 使监听器通过队列 异步 运行 — 这样慢响应(发送邮件)不会延迟响应。
事件和监听器是一个有用的 Laravel 功能,用于 解耦 代码 — 让应用程序的不同部分可以对事件做出反应,而无需紧密耦合,这对跨域反应和保持代码可维护性很有价值。
理解它们对于使用它们和在代码库中识别它们都很有帮助:该模式让你在重要事情发生时(订单发货、用户注册)dispatch 一个事件,然后让多个独立监听器做出反应(发送邮件、更新库存、记录分析),每个监听器处理一个独立的关注点。
关键好处是 通过解耦实现可扩展性 — 你可以通过注册一个监听器来添加新的响应,而无需修改 dispatch 事件的代码,从而保持关注点分离和 dispatch 代码的专注。
使监听器 队列化(ShouldQueue)以使其异步运行的能力也很重要,让缓慢的响应(邮件、外部 API 调用)在后台进行,而不会延迟用户的响应。
了解事件/监听器的工作原理、它们的解耦优势,以及用于异步处理的队列监听器,对于构建结构良好、可扩展的 Laravel 应用程序是宝贵的知识。(与其他框架中的信号一样,需要注意的是事件创造了隐式的、远程操作行为,可能更难追踪 — 因此最好用于真正的跨域解耦,而不是作为所有后续操作逻辑的默认方式,因为显式代码往往更清晰。)