Laravel: patrón Pipelines para ejecutar múltiples tareas de forma dinámica
Los pipelines de Laravel son una forma cómoda de ejecutar varias tareas una tras otra para obtener un resultado final complejo.

Tenemos que ver los Pipelines de Laravel tal y como su traducción indica. Son tuberías por las que pasan datos hasta llegar a un resultado único final. Este patrón es básicamente como funcionan los conocidos middlewares.
¿Cómo y cuándo usar un pipeline?
El caso de uso ideal para un pipeline es aquellos casos en los que necesitamos ejecutar múltiples tareas sobre un mismo objecto para procesarlo y obtener así un resultado final.
Además, los pipelines son especialmente útiles cuando este procesado sobre el objeto no es siempre igual y los casos pueden variar dependiendo del caso.
Vamos a poner que estamos trabajando sobre una tarea en la que tenemos que crear un entrenamiento paso a paso. Podríamos hacer algo como lo siguiente:
$workout = app(Pipeline::class)
->send(new Workout())
->through([
FillExercises::class,
FillSets::clas,
FillRepetitions::class,
FillRestTime::class,
])
->then(fn($workout) => $workout);
En este pipe el objeto Workout pasará por cada una de las clases indicadas en el array del parámetro throught y, al final, llegará el método then donde simplemente lo retornaremos para asignarlo a nuestra variable.
Como el array es dinámico y se pasa en tiempo de ejecución podríamos, por ejemplo, crear un entrenamiento de tipo cardio cardiovascular con un proceso similar.
$workout = app(Pipeline::class)
->send(new Workout())
->through([
FillExercises::class,
FillWorkoutTime::clas,
FillRestTime::class,
])
->then(fn($workout) => $workout);
Como vemos, con el mismo proceso y simplemente cambiando el array de tareas creamos un entrenamiento u otro dependiendo del tipo.
¿Cómo hacer un pipe?
Cada una de estas tuberías tiene que forman parte del pipeline tiene una misma estructura muy sencilla.
<?php
namespace App\Pipe;
use Closure;
class FillExercises implements Pipe
{
public function handle($workout, Closure $next)
{
// Procesamos el entrenamiento, en este caso, añadiendo
// los ejercicios y pasamos el objeto al siguiente tubo
// del proceso
return $next($workout);
}
}
Como ves son muy sencillas, simplemente reciben el objeto que estamos pasando por todo el pipeline y lo pasa al siguiente pipe, del proceso. Cada uno de estos procesos es completamente autónomo e independiente. Recibe un objeto y lo devuelve, pero no sabe que pasa antes ni después.
Más sobre Laravel:

