跳转到主要内容

什么是 Pipeline 模式

Pipeline 模式是一种将被处理对象(passable)依次通过一系列管道(处理步骤)的设计模式。每个管道接收上一步的输出、施加处理后再传给下一步。 在 Laravel 中,Illuminate\Pipeline\Pipeline 类实现了该模式,中间件的处理正是通过这种机制工作的。

在 Laravel 核心中的使用位置

Pipeline 在 Laravel 内部被广泛使用。
  • HTTP 中间件Illuminate\Foundation\Http\Kernel 将请求送入中间件 Pipeline
  • 控制台命令 — Artisan 命令的前后处理
  • Router 中间件 — 应用于路由组的中间件
来看看 HTTP Kernel 使用 Pipeline 的部分:

基本用法

send / through / thenReturn

最简单的 Pipeline 结构。
  • send($passable) — 指定要送入 Pipeline 的对象
  • through($pipes) — 指定管道数组
  • thenReturn() — 执行 Pipeline 并返回结果

then

若要用闭包指定最终处理,使用 then()

pipe

要在之后追加管道,使用 pipe()

基于类的管道

用专用类替代闭包,可以提高可复用性。每个管道类都实现 handle 方法。

via — 改变调用的方法

默认调用管道的 handle 方法,可通过 via() 指定别的方法名。

向管道传参

可以通过在类名后加 :, 向管道传参。这与中间件的 throttle:60,1 语法机制相同。

finally — Pipeline 结束后的处理

使用 finally() 方法可以注册在 Pipeline 结束后一定会执行的回调。无论成功还是失败都会执行。

withinTransaction — 在事务中执行

Laravel 11 以后,可以让整个 Pipeline 在数据库事务中执行。
也可以指定特定的数据库连接。
任何管道抛出异常时,整个事务都会回滚。

实战示例:订单处理 Pipeline

将电商站点的订单处理组合成多个管道的例子。
1

创建管道类

2

执行 Pipeline

Pipeline 的内部实现

carry() 方法是 Pipeline 的核心。它借助 array_reduce 从右往左折叠各个管道,构建闭包链。
先用 array_reverse 反转管道,再交给 array_reduce,以保证调用顺序正确。为了让第一个管道最先执行,从内向外构建闭包栈。
Pipeline 也被称作「洋葱型」架构。请求从外层(第一个管道)向内部通过,响应则从内部返回到外部。因此每个中间件都可以在 $next() 之前和之后加上处理。

与 Macroable trait 组合使用

Pipeline 类使用了 Macroable trait,可以添加自定义方法。

下一步

Macroable trait

学习向既有类添加自定义方法的 Macroable trait 的用法。
最后修改于 2026年7月18日