什么是 Pipeline 模式
Pipeline 模式是一种将被处理对象(passable)依次通过一系列管道(处理步骤)的设计模式。每个管道接收上一步的输出、施加处理后再传给下一步。 在 Laravel 中,Illuminate\Pipeline\Pipeline 类实现了该模式,中间件的处理正是通过这种机制工作的。
在 Laravel 核心中的使用位置
Pipeline 在 Laravel 内部被广泛使用。- HTTP 中间件 —
Illuminate\Foundation\Http\Kernel将请求送入中间件 Pipeline - 控制台命令 — Artisan 命令的前后处理
- Router 中间件 — 应用于路由组的中间件
基本用法
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,以保证调用顺序正确。为了让第一个管道最先执行,从内向外构建闭包栈。
与 Macroable trait 组合使用
Pipeline 类使用了 Macroable trait,可以添加自定义方法。
下一步
Macroable trait
学习向既有类添加自定义方法的 Macroable trait 的用法。