什麼是 tap()
tap() 是「使用值同時將該值原封不動回傳」的 helper。用於希望插入副作用時。
Illuminate\Support\helpers.php 的實作很簡單。
tap() 會忽略 callback 的回傳值。回傳值恆為原始值。基本用法
最基本的用法為接收值處理後原封不動回傳。HigherOrderTapProxy,因此可直接串接方法呼叫。
常見用途
插入除錯輸出
於鏈中插入日誌或事件發送
不改變回傳值僅執行副作用
什麼是 Tappable trait
use Illuminate\Support\Traits\Tappable 後,可為類別加入 tap() 方法。
tap()。
套件開發的活用
Tappable 於希望在 Fluent API 中間插入副作用時很方便。結合 Macroable 與 Conditionable,可以做出 Laravel 風格且可擴充的 Builder。
1
建立 Fluent 類別
2
組合 Macroable、Conditionable、Tappable 使用
- Macroable trait
- Conditionable trait
- VOICEVOX for Laravel — 以
tap()調整TalkAudioQuery或SongAudioQuery後再送入generate()的實務範例
Laravel Core 內的使用範例
Laravel 本體中,tap() / Tappable 也實際被使用。
Illuminate\Routing\Router併用Macroable與TappableRouter::respondWithRoute()中使用不帶 callback 的tap($route)->bind(...),於bind()執行後仍回傳原始的$routeRouter::prepareResponse()於 Response 轉換後以tap(..., fn (...) => event(...))觸發事件Illuminate\Testing\Fluent\Concerns\Has中,以->tap(...)->first(...)->etc()的鏈實作斷言輔助
tap() 單獨看是小巧的 helper,但結合 Macroable、Conditionable 後,較容易寫出 Laravel 中常見的易讀方法鏈。下一步
Macroable trait
學習為既有類別加入自訂方法的設計。
Conditionable trait
學習以
when() / unless() 的條件分支鏈。