tap() とは
tap() は「値を使いながら、その値をそのまま返す」ためのヘルパーです。副作用を挟みたいときに使います。
Illuminate\Support\helpers.php の実装はシンプルです。
tap() はコールバックの戻り値を無視します。戻り値は常に元の値です。基本的な使い方
もっとも基本的な使い方は、値を受け取って処理したあと、そのまま返す形です。HigherOrderTapProxy が返るので、メソッド呼び出しをそのままつなげられます。
よくある使い所
デバッグ出力を挟む
チェーン中にログやイベント送信を挿入する
返り値を変えずに副作用だけ実行する
Tappable トレイトとは
Illuminate\Support\Traits\Tappable を use すると、クラスに tap() メソッドを追加できます。
tap() を提供するだけです。
パッケージ開発での活用
Tappable は Fluent API の途中で副作用を差し込みたいときに便利です。Macroable と Conditionable を組み合わせると、Laravelらしい拡張可能なビルダーを作れます。
1
フルーエントなクラスを作る
2
Macroable・Conditionable・Tappable を組み合わせて使う
- Macroableトレイト
- Conditionableトレイト
- VOICEVOX for Laravel —
TalkAudioQueryやSongAudioQueryをtap()で調整してからgenerate()へ流す実用例
Laravelコア内での使用例
Laravel本体でもtap() / Tappable は実際に使われています。
Illuminate\Routing\RouterはMacroableとTappableを併用していますRouter::respondWithRoute()ではコールバックなしのtap($route)->bind(...)を使い、bind()実行後も元の$routeを返していますRouter::prepareResponse()ではレスポンス変換後にtap(..., fn (...) => event(...))でイベントを発火していますIlluminate\Testing\Fluent\Concerns\Hasでは->tap(...)->first(...)->etc()というチェーンでアサーション補助を実装しています
tap() は単体だと小さなヘルパーですが、Macroable・Conditionable と合わせると Laravel でよく見る読みやすいメソッドチェーンを作りやすくなります。次のステップ
Macroableトレイト
既存クラスに独自メソッドを追加する設計を学びます。
Conditionableトレイト
when() / unless() による条件分岐チェーンを学びます。