Skip to main content

Conditionableトレイトとは

Illuminate\Support\Traits\Conditionable トレイトは、オブジェクトに when()unless() メソッドを追加します。条件に応じて処理を分岐しながらメソッドチェーンを続けられるのが特徴です。
実際のソースは src/Illuminate/Conditionable/Traits/Conditionable.php にあります。Illuminate\Support\Traits\Conditionable というエイリアスから参照されています。
QueryBuilder・EloquentBuilder・Mail・Notification など、Laravelの多くのクラスがこのトレイトを使っています。

基本的な使い方

when() — 条件が真のとき実行する

第1引数の値が真のとき、第2引数のコールバックが実行されます。偽のときは第3引数のコールバック(デフォルト)が実行されます。

unless() — 条件が偽のとき実行する

unless()when() の逆です。条件が偽のときにコールバックが実行されます。

メソッドチェーンが続く理由

コールバックの戻り値が null の場合、$this(トレイトを使っているオブジェクト)が返ります。コールバックが null を返さない場合はその戻り値が返ります。
ソースコードでは次のように実装されています。
コールバックが明示的な値を返した場合はその値がチェーンの次に渡ります。何も返さない(null)場合は $this が返ります。

引数なしで呼ぶ — HigherOrderWhenProxy

引数ゼロで when() を呼ぶと HigherOrderWhenProxy が返ります。これを使うと条件を後から設定できます。
引数1つで呼ぶと、その値を条件として持つプロキシが返ります。

クロージャを値として渡す

第1引数にクロージャを渡すと、そのクロージャが実行された戻り値が条件として使われます。
これにより条件の評価ロジックをコールバックに切り出せます。

QueryBuilderでの典型パターン

when() を使った動的クエリ構築は最も一般的なユースケースです。

Conditionableを自前のクラスに適用する

トレイトを use するだけで when() / unless() が使えるようになります。

Mail・Notification・Responseでの活用

when() はメール・通知・レスポンス構築でも使えます。

tap() との使い分け

tap()when() は似ていますが目的が異なります。
デバッグや副作用のためにチェーン中で何かしたいだけなら tap() を使います。条件によって処理を切り替えたいなら when() / unless() を使います。

次のステップ

コレクションの高階メッセージ

$collection->map->method() のような構文の仕組みと実践的な使い方を学びます。
最終更新日 2026年3月28日