Skip to main content

Was ist der Conditionable-Trait?

Der Trait Illuminate\Support\Traits\Conditionable erweitert ein Objekt um die Methoden when() und unless(). Sein Kennzeichen: Sie können Verzweigungen einbauen und dennoch die Method-Chain fortsetzen.
Der eigentliche Quellcode befindet sich unter src/Illuminate/Conditionable/Traits/Conditionable.php und wird über den Alias Illuminate\Support\Traits\Conditionable referenziert.
Viele Klassen von Laravel wie QueryBuilder, EloquentBuilder, Mail oder Notification setzen diesen Trait ein.

Grundlegende Verwendung

when() — bei wahrer Bedingung ausführen

Ist der Wert des ersten Arguments wahr, wird der Callback des zweiten Arguments ausgeführt. Ist er falsch, wird der Standard-Callback des dritten Arguments ausgeführt.

unless() — bei falscher Bedingung ausführen

unless() ist die Umkehrung von when(). Der Callback wird ausgeführt, wenn die Bedingung falsch ist.

Warum die Method-Chain fortgesetzt wird

Gibt der Callback null zurück, wird $this (das Objekt, das den Trait verwendet) zurückgegeben. Gibt der Callback etwas anderes als null zurück, wird dieser Rückgabewert weitergereicht.
Der Quellcode ist wie folgt implementiert:
Gibt der Callback einen expliziten Wert zurück, wird dieser Wert an die Chain weitergegeben. Gibt er nichts (null) zurück, wird $this weitergereicht.

Aufruf ohne Argumente — HigherOrderWhenProxy

Ruft man when() ganz ohne Argumente auf, wird ein HigherOrderWhenProxy zurückgegeben. Damit können Sie die Bedingung nachträglich festlegen.
Mit einem einzigen Argument erhalten Sie einen Proxy, der diesen Wert als Bedingung speichert.

Eine Closure als Wert übergeben

Wird als erstes Argument eine Closure übergeben, wird deren Rückgabewert als Bedingung verwendet.
So können Sie die Auswertungslogik der Bedingung in einen Callback auslagern.

Typisches Muster im QueryBuilder

Der dynamische Aufbau einer Query mit when() ist der häufigste Anwendungsfall.

Conditionable in eigenen Klassen einsetzen

Nach einem einfachen use des Traits stehen when() und unless() zur Verfügung.

Einsatz bei Mail, Notification und Response

when() lässt sich auch beim Aufbau von Mails, Notifications und Responses nutzen.

Abgrenzung zu tap()

tap() und when() ähneln sich, verfolgen aber unterschiedliche Ziele.
Wollen Sie nur Debugging oder Seiteneffekte innerhalb der Chain unterbringen, nutzen Sie tap(). Wollen Sie den Ablauf abhängig von einer Bedingung umschalten, verwenden Sie when() / unless().

Nächste Schritte

Higher-Order Messages in Collections

Lernen Sie Funktionsweise und praktischen Einsatz von Syntax wie $collection->map->method() kennen.
Zuletzt geändert am 13. Juli 2026