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 classeIlluminate\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\Kernella 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
Uso di base
send / through / thenReturn
Ecco la struttura più semplice di una pipeline.send($passable)— indica l’oggetto che attraverserà la pipelinethrough($pipes)— indica l’array di pipethenReturn()— esegue la pipeline e restituisce il risultato
then
Se vuoi indicare l’elaborazione finale con una closure, usathen().
pipe
Per aggiungere pipe successivamente usapipe().
Pipe class-based
Usando classi dedicate al posto di closure aumenti la riusabilità. Ogni classe pipe implementa il metodohandle.
via — cambiare il metodo invocato
Di default viene chiamato il metodohandle 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 metodofinally() 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.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 metodocarry() è il cuore della pipeline. Con array_reduce piega le pipe da destra a sinistra e costruisce la catena di closure.
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.
Combinazione con il trait Macroable
La classePipeline 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.