Skip to main content

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 clase Illuminate\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 HTTPIlluminate\Foundation\Http\Kernel hace 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.
Veamos la parte del HTTP kernel donde se usa el pipeline.

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, usa then().

pipe

Para añadir pipes a posteriori, usa pipe().

Pipes basados en clase

Usar clases dedicadas en vez de closures mejora la reutilización. Cada clase implementa el método handle.

via — cambiar el método invocado

Por defecto se llama al método handle 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

Con finally() 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.
Puedes indicar una conexión concreta.
Si alguno de los pipes lanza una excepción, se hace rollback de toda la transacción.

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étodo carry() es el corazón del pipeline. Usa array_reduce para plegar los pipes de derecha a izquierda y construir una cadena de closures.
Al invertir los pipes con 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.
El pipeline también se conoce como arquitectura «cebolla». La request atraviesa las capas de fuera adentro (empezando por el primer pipe) y la response vuelve de dentro hacia fuera. Por eso cada middleware puede añadir lógica antes y después de llamar a $next().

Uso combinado con el trait Macroable

La clase Pipeline 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.
Última modificación el 13 de julio de 2026