Skip to main content

Qu’est-ce que le trait Conditionable

Le trait Illuminate\Support\Traits\Conditionable ajoute les méthodes when() et unless() à un objet. Sa particularité est de permettre de continuer une chaîne de méthodes tout en dérivant le traitement en fonction d’une condition.
Les sources réelles se trouvent dans src/Illuminate/Conditionable/Traits/Conditionable.php. Elles sont référencées via l’alias Illuminate\Support\Traits\Conditionable.
De nombreuses classes Laravel utilisent ce trait : QueryBuilder, EloquentBuilder, Mail, Notification, etc.

Utilisation de base

when() — s’exécute lorsque la condition est vraie

Quand la valeur du premier argument est vraie, le callback du second argument est exécuté. Sinon, le callback (par défaut) du troisième argument est exécuté.

unless() — s’exécute lorsque la condition est fausse

unless() est l’inverse de when(). Le callback est exécuté lorsque la condition est fausse.

Pourquoi le chaînage continue

Si la valeur de retour du callback est null, c’est $this (l’objet qui utilise le trait) qui est retourné. Si le callback ne retourne pas null, c’est sa valeur de retour qui est retournée.
Dans le code source, cela est implémenté ainsi :
Si le callback retourne explicitement une valeur, cette valeur est passée au maillon suivant de la chaîne. S’il ne retourne rien (null), $this est retourné.

Appel sans argument — HigherOrderWhenProxy

Appeler when() sans argument retourne un HigherOrderWhenProxy. Cela permet de définir la condition ultérieurement.
Avec un seul argument, un proxy contenant cette valeur comme condition est retourné.

Passer une closure comme valeur

Passer une closure en premier argument utilise la valeur de retour de l’exécution de cette closure comme condition.
Cela permet d’extraire la logique d’évaluation de la condition dans un callback.

Pattern typique avec QueryBuilder

La construction dynamique de requêtes avec when() est le cas d’usage le plus courant.

Appliquer Conditionable à votre propre classe

Il suffit d’un use du trait pour disposer de when() / unless().

Utilisation avec Mail, Notification, Response

when() est également utilisable pour la construction d’e-mails, de notifications et de réponses.

Différence avec tap()

tap() et when() se ressemblent mais ont des objectifs différents.
Si vous voulez juste faire quelque chose au milieu d’une chaîne pour du debug ou un effet de bord, utilisez tap(). Pour changer le traitement selon une condition, utilisez when() / unless().

Étapes suivantes

Messages d'ordre supérieur de Collection

Apprenez le mécanisme de la syntaxe $collection->map->method() et son utilisation pratique.
Dernière modification le 13 juillet 2026