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:

Laravel Facades, ¿qué son y cómo y por qué usarlas?
Las Facades o fachadas de Laravel son una interfaz estática para acceder a los métodos de nuestras clases. Ofrecen grandes ventajas a la hora de testear el código.
Understanding Laravel Pipelines
Basically, using laravel pipelines you can pass an object between several classes in a fluid way to perform any type of task and finally return the resulting value once all the “tasks” have been executed.