Skip to main content

Conditionable trait 是什麼

Illuminate\Support\Traits\Conditionable trait 為物件加入 when()unless() 方法。特色是可依條件分支處理,同時延續方法鏈。
實際原始碼位於 src/Illuminate/Conditionable/Traits/Conditionable.php,並透過 Illuminate\Support\Traits\Conditionable 別名被參照。
QueryBuilder、EloquentBuilder、Mail、Notification 等 Laravel 中許多類別皆使用此 trait。

基本用法

when() — 條件為真時執行

當第 1 個引數的值為真時,執行第 2 個引數的 callback。為偽時,會執行第 3 個引數的 callback(預設)。

unless() — 條件為偽時執行

unless()when() 的相反。條件為偽時執行 callback。

方法鏈能持續的理由

若 callback 的回傳值為 null,會回傳 $this(使用 trait 的物件)。若 callback 不回傳 null,則回傳其回傳值。
原始碼中如下實作:
若 callback 明確回傳值,該值即傳遞至鏈的下一環節。若未回傳任何值(null),則回傳 $this

不帶引數呼叫 — HigherOrderWhenProxy

以零引數呼叫 when() 會回傳 HigherOrderWhenProxy,可利用此後再設定條件。
以 1 個引數呼叫時,會回傳持有該值作為條件的 proxy。

將 closure 作為值傳入

若在第 1 個引數傳入 closure,會以該 closure 的執行結果作為條件。
如此可將條件評估邏輯抽出至 callback。

QueryBuilder 的典型模式

使用 when() 動態構建查詢是最常見的使用情境。

將 Conditionable 應用於自訂類別

只要 use 該 trait 就能使用 when() / unless()

在 Mail、Notification、Response 中的活用

when() 亦可用於郵件、通知及回應的建立。

與 tap() 的差異

tap()when() 相似,但用途不同。
若僅為除錯或副作用而希望在鏈中執行某事,使用 tap()。若希望依條件切換處理,則使用 when() / unless()

下一步

Collection 的 Higher Order Messages

學習 $collection->map->method() 這類語法的機制及實務用法。
最後修改於 2026年8月2日