Skip to main content

什麼是 tap()

tap() 是「使用值同時將該值原封不動回傳」的 helper。用於希望插入副作用時。 Illuminate\Support\helpers.php 的實作很簡單。
tap() 會忽略 callback 的回傳值。回傳值恆為原始值。

基本用法

最基本的用法為接收值處理後原封不動回傳。
若省略 callback,會回傳 HigherOrderTapProxy,因此可直接串接方法呼叫。

常見用途

插入除錯輸出

於鏈中插入日誌或事件發送

不改變回傳值僅執行副作用

若要加工回傳值,可使用 with() 或一般變數指派。若將 tap() 限定於副作用會較易讀。

什麼是 Tappable trait

use Illuminate\Support\Traits\Tappable 後,可為類別加入 tap() 方法。
也就是僅提供實例方法版的 tap()

套件開發的活用

Tappable 於希望在 Fluent API 中間插入副作用時很方便。結合 MacroableConditionable,可以做出 Laravel 風格且可擴充的 Builder。
1

建立 Fluent 類別

2

組合 Macroable、Conditionable、Tappable 使用

相關頁面:

Laravel Core 內的使用範例

Laravel 本體中,tap() / Tappable 也實際被使用。
  • Illuminate\Routing\Router 併用 MacroableTappable
  • Router::respondWithRoute() 中使用不帶 callback 的 tap($route)->bind(...),於 bind() 執行後仍回傳原始的 $route
  • Router::prepareResponse() 於 Response 轉換後以 tap(..., fn (...) => event(...)) 觸發事件
  • Illuminate\Testing\Fluent\Concerns\Has 中,以 ->tap(...)->first(...)->etc() 的鏈實作斷言輔助
tap() 單獨看是小巧的 helper,但結合 MacroableConditionable 後,較容易寫出 Laravel 中常見的易讀方法鏈。

下一步

Macroable trait

學習為既有類別加入自訂方法的設計。

Conditionable trait

學習以 when() / unless() 的條件分支鏈。
最後修改於 2026年8月2日