Skip to main content

Cos’è il trait Conditionable

Il trait Illuminate\Support\Traits\Conditionable aggiunge alla tua classe i metodi when() e unless(). La sua caratteristica principale è permettere di diramare l’elaborazione in base a una condizione mantenendo la method chain.
Il codice sorgente reale si trova in src/Illuminate/Conditionable/Traits/Conditionable.php. È referenziato tramite l’alias Illuminate\Support\Traits\Conditionable.
Molte classi Laravel — QueryBuilder, EloquentBuilder, Mail, Notification — utilizzano questo trait.

Uso di base

when() — esegue quando la condizione è vera

Se il primo argomento è vero, viene eseguito il callback passato come secondo argomento. Se è falso, viene eseguito il callback di default (terzo argomento).

unless() — esegue quando la condizione è falsa

unless() è l’inverso di when(). Il callback viene eseguito quando la condizione è falsa.

Perché la method chain continua

Se il valore di ritorno del callback è null, viene restituito $this (l’oggetto che usa il trait). Se il callback non restituisce null, viene restituito quel valore.
Nel codice sorgente è implementato così:
Se il callback restituisce un valore esplicito, quel valore viene propagato al passo successivo della catena. Se non restituisce nulla (null), viene restituito $this.

Chiamare senza argomenti — HigherOrderWhenProxy

Chiamando when() senza argomenti viene restituito un HigherOrderWhenProxy. Con esso puoi impostare la condizione a posteriori.
Chiamandolo con un solo argomento ottieni un proxy che porta con sé quel valore come condizione.

Passare una closure come valore

Se passi una closure come primo argomento, il valore di ritorno di quella closure viene usato come condizione.
In questo modo puoi estrarre in un callback la logica di valutazione della condizione.

Pattern tipico con il QueryBuilder

La costruzione dinamica delle query con when() è il caso d’uso più comune.

Applicare Conditionable a una tua classe

Basta use del trait per avere disponibili when() / unless().

Utilizzo in Mail, Notification e Response

when() è utilizzabile anche nella costruzione di email, notifiche e response.

Quando usare tap() e quando when()

tap() e when() si assomigliano, ma hanno scopi diversi.
Se vuoi solo eseguire qualcosa nella catena per debug o side effect, usa tap(). Se vuoi cambiare comportamento in base a una condizione, usa when() / unless().

Prossimi passi

Higher-order messages delle collection

Impara il meccanismo di sintassi come $collection->map->method() e il suo utilizzo pratico.
Ultima modifica il 13 luglio 2026