Conditionableトレイトとは
Illuminate\Support\Traits\Conditionable トレイトは、オブジェクトに when() と unless() メソッドを追加します。条件に応じて処理を分岐しながらメソッドチェーンを続けられるのが特徴です。
実際のソースは
src/Illuminate/Conditionable/Traits/Conditionable.php にあります。Illuminate\Support\Traits\Conditionable というエイリアスから参照されています。基本的な使い方
when() — 条件が真のとき実行する
unless() — 条件が偽のとき実行する
unless() は when() の逆です。条件が偽のときにコールバックが実行されます。
メソッドチェーンが続く理由
コールバックの戻り値がnull の場合、$this(トレイトを使っているオブジェクト)が返ります。コールバックが null を返さない場合はその戻り値が返ります。
null)場合は $this が返ります。
引数なしで呼ぶ — HigherOrderWhenProxy
引数ゼロでwhen() を呼ぶと HigherOrderWhenProxy が返ります。これを使うと条件を後から設定できます。
クロージャを値として渡す
第1引数にクロージャを渡すと、そのクロージャが実行された戻り値が条件として使われます。QueryBuilderでの典型パターン
when() を使った動的クエリ構築は最も一般的なユースケースです。
Conditionableを自前のクラスに適用する
トレイトをuse するだけで when() / unless() が使えるようになります。
Mail・Notification・Responseでの活用
when() はメール・通知・レスポンス構築でも使えます。
tap() との使い分け
tap() と when() は似ていますが目的が異なります。
次のステップ
コレクションの高階メッセージ
$collection->map->method() のような構文の仕組みと実践的な使い方を学びます。