Skip to main content

Cos’è il pattern pipeline

Il pattern pipeline è un design pattern che fa passare un oggetto da elaborare (passable) attraverso una serie ordinata di pipe (step). Ogni pipe riceve l’output dello step precedente, aggiunge la propria elaborazione e passa al successivo. In Laravel il pattern è implementato dalla classe Illuminate\Pipeline\Pipeline; è esattamente il meccanismo che regge l’elaborazione dei middleware.

Punti di utilizzo nel core di Laravel

La pipeline è usata in modo diffuso nel cuore di Laravel.
  • Middleware HTTP — in Illuminate\Foundation\Http\Kernel la richiesta passa attraverso la pipeline dei middleware
  • Comandi console — pre e post elaborazione dei comandi Artisan
  • Middleware del Router — applicazione dei middleware ai gruppi di rotte
Osserviamo il punto in cui l’HTTP kernel usa la pipeline.

Uso di base

send / through / thenReturn

Ecco la struttura più semplice di una pipeline.
  • send($passable) — indica l’oggetto che attraverserà la pipeline
  • through($pipes) — indica l’array di pipe
  • thenReturn() — esegue la pipeline e restituisce il risultato

then

Se vuoi indicare l’elaborazione finale con una closure, usa then().

pipe

Per aggiungere pipe successivamente usa pipe().

Pipe class-based

Usando classi dedicate al posto di closure aumenti la riusabilità. Ogni classe pipe implementa il metodo handle.

via — cambiare il metodo invocato

Di default viene chiamato il metodo handle della pipe, ma con via() puoi indicarne un altro.

Passare parametri alla pipe

Puoi passare parametri alle pipe usando : e , nel nome della classe. È lo stesso meccanismo della sintassi dei middleware throttle:60,1.

finally — elaborazione al termine della pipeline

Con il metodo finally() registri un callback che verrà eseguito sempre al termine della pipeline, indipendentemente da successo o fallimento.

withinTransaction — esecuzione dentro una transazione

Da Laravel 11 puoi eseguire l’intera pipeline all’interno di una transazione del database.
Puoi anche indicare una specifica connessione al database.
Se una qualsiasi pipe solleva un’eccezione, l’intera transazione viene rollbackata.

Esempio pratico: pipeline di gestione ordini

Un esempio in cui l’elaborazione degli ordini di un e-commerce è composta da più pipe.
1

Creare le classi pipe

2

Eseguire la pipeline

Implementazione interna di Pipeline

Il metodo carry() è il cuore della pipeline. Con array_reduce piega le pipe da destra a sinistra e costruisce la catena di closure.
Passando le pipe in ordine inverso ad array_reduce con array_reverse si mantiene l’ordine corretto di invocazione. Lo stack di closure viene costruito dall’interno verso l’esterno, così che la prima pipe venga eseguita per prima.
La pipeline è chiamata anche architettura “a cipolla”. La richiesta attraversa gli strati dall’esterno (la prima pipe) verso l’interno, e la risposta torna indietro dall’interno verso l’esterno. È per questo che ogni middleware può aggiungere logica prima e dopo la chiamata a $next().

Combinazione con il trait Macroable

La classe Pipeline usa il trait Macroable, quindi puoi aggiungere metodi personalizzati.

Prossimi passi

Trait Macroable

Impara come aggiungere metodi personalizzati alle classi esistenti con il trait Macroable.
Ultima modifica il 13 luglio 2026