中间件 vs 事件

框架机制 · 横切面与解耦

中间件 vs 事件:
不是对立,而是分工

一个在请求的关口设卡,一个在业务的节点广播。深入它们的工作机制,才能真正理解“横切”与“解耦”的艺术。

中间件:请求流程中的“关卡”

中间件就像进入大厦前的门禁和安检系统。每个 HTTP 请求到达控制器之前,必须先穿过一系列中间件。中间件可以检查来访者身份、检查通行证,甚至可以当场拒绝入内(返回 401/403)。

在 ThinkPHP 8 中,中间件通过 handle 方法实现,请求被层层包裹,形成一条“洋葱皮”执行链。

// app/middleware/Auth.php namespace app\middleware; class Auth { public function handle($request, \Closure $next) { if (!$request->header('Authorization')) { return json(['code' => 401])->code(401); } // 验证通过,放行到下一层(下一个中间件或控制器) return $next($request); } }

这里 $next($request) 就是通往下一层的钥匙。中间件可以决定是否继续传递请求。它关注的是请求本身——谁发起的、有没有权限、是否符合格式。

事件:业务动作的“广播站”

事件则完全不同。它不拦截任何流程,而是在系统内部某个重要的业务时刻,向外界发出一个信号:“有事情发生了,需要的请自行处理。”

在 TP8 中,事件通过 event() 助手函数或 Event::trigger() 触发,监听器则负责响应。事件本身不知道谁会接收消息,这实现了业务逻辑的彻底解耦。

// 在订单服务中触发事件 namespace app\service; class OrderService { public function create($data) { $order = Order::create($data); // 触发事件:订单已创建 event('OrderCreated', $order); return $order; } }

然后在另一个监听器中处理后续逻辑:

// app/listener/SendOrderSms.php class SendOrderSms { public function handle($order) { // 发送订单短信,与订单创建流程完全解耦 Sms::send($order->phone, '订单已创建'); } }

注意:事件不影响 OrderService::create() 的正常返回。主流程只管“创建订单”,发短信、加积分这些副作用都由监听器异步或同步处理,主业务毫不关心。

最本质的对比:关卡 vs 广播

对比维度中间件 (Middleware)事件 (Event)
核心角色请求的拦截器行为的观察者/广播员
执行时机控制器执行前后(环绕)业务逻辑中的某个锚点
是否阻断流程可以(返回响应即阻断)不阻断,只通知
关注点HTTP 请求、认证、日志等横向功能业务动作的副作用(发邮件、推送)
耦合度与请求流程强相关与主业务完全解耦

一句话:中间件控制“能不能进”,事件说“我做完了,你们随意”。它们一个是请求通道上的阀门,一个是业务结果上的扩音器。

一个完整的请求生命周期示例

假设用户下单,经历以下过程:

① 中间件阶段:请求进入 → Auth 中间件验证 token → Log 中间件记录请求日志 → 通过后到达控制器。

② 控制器调度:控制器接收参数,调用 OrderService::create()

③ 业务服务内部:创建订单记录 → 触发 OrderCreated 事件

④ 事件监听:SendOrderSms 监听器发送短信,UpdateStats 监听器更新统计数据。

⑤ 响应返回:控制器返回 JSON 给客户端。

在这个过程中,中间件负责请求的“准入和预处理”,事件负责业务的“后置扩散”。它们各司其职,共同构建了一个灵活、可扩展的系统。

🧅

一个生动的比喻:进入一家会员制餐厅

  • 中间件 是门口的接待员和衣帽寄存处。接待员检查预约(认证)、寄存处记录客人到来(日志)。如果没预约,直接拦在门外。
  • 事件 是顾客点完菜后,厨房里的广播:“海鲜意面订单来了!”听到广播,海鲜档口开始备料,甜点师傅也开始准备随餐赠送的甜点。但点菜流程已经完成,广播不影响顾客继续喝水等待。

这样理解,两者的职责边界就非常清晰了。

中间件是流程的阀门,管理请求的进出;
事件是结果的广播,让业务后续处理自由插拔。
一个横向守护,一个纵向解耦,
共同构成了现代框架灵活与健壮的基石。

本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!

推荐资讯

热门标签

广告
YznCMS后台开发框架
后台框架永久免费且商业授权无限制
立即查看

资源下载