Skip to main content

什麼是 Pipeline 模式

Pipeline 模式是將處理對象物件(passable)依序通過一連串 pipe(處理步驟)的設計模式。每個 pipe 接收前一步驟的輸出,加上處理後傳給下一個步驟。 Laravel 中,Illuminate\Pipeline\Pipeline 類別實作了此模式。中介層的處理正是以此機制運作。

Laravel Core 中的使用位置

Pipeline 廣泛用於 Laravel 的核心。
  • HTTP 中介層Illuminate\Foundation\Http\Kernel 將請求通過中介層的 Pipeline
  • Console 指令 — Artisan 指令的前後處理
  • Router 的中介層 — 路由群組的中介層套用
來看看 HTTP Kernel 使用 Pipeline 的部分。

基本用法

send / through / thenReturn

最單純的 Pipeline 構成。
  • send($passable) — 指定要通過 Pipeline 的物件
  • through($pipes) — 指定 pipe 的陣列
  • thenReturn() — 執行 Pipeline 並回傳結果

then

若希望以 closure 指定最終處理,可使用 then()

pipe

要於事後追加 pipe,使用 pipe()

類別化的 Pipe

以專用類別取代 closure,可提高可重複利用性。各 pipe 類別實作 handle 方法。

via — 變更呼叫的方法

預設會呼叫 pipe 的 handle 方法,但可用 via() 指定其他方法名稱。

對 Pipe 傳遞參數

於類別名稱使用 :, 可對 pipe 傳遞參數。這與中介層的 throttle:60,1 語法相同的機制。

finally — Pipeline 結束後的處理

使用 finally() 方法可註冊 Pipeline 結束後必定執行的 callback。不論成功或失敗都會執行。

withinTransaction — 於交易內執行

Laravel 11 以後,可將整個 Pipeline 於資料庫交易內執行。
也可以指定特定的資料庫連線。
若任一 pipe 發生例外,整個交易會 rollback。

實務範例:訂單處理 Pipeline

以下為以多個 pipe 構成電商網站訂單處理的範例。
1

建立 pipe 類別

2

執行 Pipeline

Pipeline 的內部實作

carry() 方法是 Pipeline 的核心部分。以 array_reduce 將 pipe 由右向左折疊,建構 closure 的鏈。
array_reverse 將 pipe 反轉後傳入 array_reduce,可正確維持呼叫順序。為使第一個 pipe 首先執行,會從內側堆疊 closure。
Pipeline 又稱為「洋蔥式」架構。請求由外層(第一個 pipe)向內通過,回應則從內側回到外側。這也是各中介層可於呼叫 $next() 前後加上處理的原因。

與 Macroable trait 併用

Pipeline 類別使用了 Macroable trait,因此可以新增自訂方法。

下一步

Macroable trait

學習為既有類別新增自訂方法的 Macroable trait 用法。
最後修改於 2026年8月2日