Qué es el patrón Pipeline
El patrón Pipeline consiste en hacer pasar un objeto (el «passable») por una serie de pipes (pasos de procesamiento) en orden. Cada pipe recibe la salida del paso anterior, la procesa y la pasa al siguiente. En Laravel, este patrón lo implementa la claseIlluminate\Pipeline\Pipeline y es exactamente el mecanismo que utilizan los middlewares.
Dónde lo usa el core de Laravel
El pipeline se usa mucho en el corazón de Laravel:- Middlewares HTTP —
Illuminate\Foundation\Http\Kernelhace pasar la petición por el pipeline de middlewares. - Comandos de consola — procesamiento antes y después de los comandos Artisan.
- Middlewares del Router — aplicación de middlewares a grupos de rutas.
Uso básico
send / through / thenReturn
La forma más sencilla de configurar un pipeline.send($passable)— indica el objeto que atravesará el pipeline.through($pipes)— indica el array de pipes.thenReturn()— ejecuta el pipeline y devuelve el resultado.
then
Para definir el procesamiento final con un closure, usathen().
pipe
Para añadir pipes a posteriori, usapipe().
Pipes basados en clase
Usar clases dedicadas en vez de closures mejora la reutilización. Cada clase implementa el métodohandle.
via — cambiar el método invocado
Por defecto se llama al métodohandle del pipe, pero con via() puedes indicar otro nombre.
Pasar parámetros a los pipes
Con: y , en el nombre de la clase puedes pasar parámetros al pipe. Es el mismo mecanismo que en el middleware throttle:60,1.
finally — código posterior al pipeline
Confinally() registras un callback que se ejecuta siempre al terminar el pipeline, tanto si hay éxito como si hay excepción.
withinTransaction — ejecutar dentro de una transacción
Desde Laravel 11, puedes ejecutar todo el pipeline dentro de una transacción de base de datos.Ejemplo práctico: pipeline de procesamiento de pedidos
Ejemplo que compone el procesamiento de un pedido en un e-commerce mediante varios pipes.1
Crea las clases pipe
2
Ejecuta el pipeline
Implementación interna de Pipeline
El métodocarry() es el corazón del pipeline. Usa array_reduce para plegar los pipes de derecha a izquierda y construir una cadena de closures.
array_reverse y pasarlos a array_reduce, se conserva el orden de invocación correcto. La pila de closures se apila de dentro hacia fuera para que el primer pipe se ejecute primero.
Uso combinado con el trait Macroable
La clasePipeline usa el trait Macroable, así que puedes añadirle métodos propios.
Próximos pasos
Trait Macroable
Aprende cómo usar el trait Macroable para añadir métodos propios a clases existentes.