什麼是 Pipeline 模式
Pipeline 模式是將處理對象物件(passable)依序通過一連串 pipe(處理步驟)的設計模式。每個 pipe 接收前一步驟的輸出,加上處理後傳給下一個步驟。 Laravel 中,Illuminate\Pipeline\Pipeline 類別實作了此模式。中介層的處理正是以此機制運作。
Laravel Core 中的使用位置
Pipeline 廣泛用於 Laravel 的核心。- HTTP 中介層 —
Illuminate\Foundation\Http\Kernel將請求通過中介層的 Pipeline - Console 指令 — Artisan 指令的前後處理
- Router 的中介層 — 路由群組的中介層套用
基本用法
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 於資料庫交易內執行。實務範例:訂單處理 Pipeline
以下為以多個 pipe 構成電商網站訂單處理的範例。1
建立 pipe 類別
2
執行 Pipeline
Pipeline 的內部實作
carry() 方法是 Pipeline 的核心部分。以 array_reduce 將 pipe 由右向左折疊,建構 closure 的鏈。
array_reverse 將 pipe 反轉後傳入 array_reduce,可正確維持呼叫順序。為使第一個 pipe 首先執行,會從內側堆疊 closure。
與 Macroable trait 併用
Pipeline 類別使用了 Macroable trait,因此可以新增自訂方法。
下一步
Macroable trait
學習為既有類別新增自訂方法的 Macroable trait 用法。