Patrón de Diseño Pipeline en Laravel

Spread the love

El patrón de diseño Pipeline (Tubería) consiste en hacer pasar una estructura o un objeto a través de una secuencia de tareas o etapas.

La tubería actúa como una línea de montaje, donde los datos se procesan y luego pasan a la siguiente etapa.

El patrón de diseño Pipeline (Tubería) consiste en hacer pasar una estructura o un objeto a través de una secuencia de tareas o etapas.

La tubería actúa como una línea de montaje, donde los datos se procesan y luego pasan a la siguiente etapa.

El uso de un pipeline es ventajoso porque es realmente fácil componer un proceso complejo como una serie tareas individuales (ver imagen).

También facilita la adición, eliminación o sustitución de etapas dentro del pipeline sin alterar todo el proceso.

En su forma mas simple podemos implementar un pipeline como sigue:

        $tasks = [

            fn($message) => strtoupper($message),

            fn($message) =>  str_split($message),

            fn($message) => array_map(fn($item) => trim($item), $message),

            fn($message) => implode(' ', $message),

        ];

        $message = 'hola mundo';

        foreach($tasks as $task) {
            $message = $task($message);
        }

        echo $message; //H O L A  M U N D O

La primera parte del código cuenta con un stack de tareas que pueden procesar el mensaje:

$tasks = [

            fn($message) => strtoupper($message),

            fn($message) =>  str_split($message),

            fn($message) => array_map(fn($item) => trim($item), $message),

            fn($message) => implode(' ', $message),

        ];

El mensaje es procesado por cada función y su resultado se pasa a la siguiente en el stack.

Para nuestro ejemplo esto lo hacemos en el foreach

foreach($tasks as $task) {
    $message = $task($message);
}

Repositorio

Si quieres ver todos los detalles de la implementación Seba Carrasco Poblete a realizado un gran trabajo creando un repositorio que recrea este ejemplo basándose en esta explicación 👍🏼

Cómo implementar el Patrón Pipeline

Laravel utiliza el patrón de diseño Pipeline en un par de lugares a lo largo del framework.

Esto significa que todo lo que necesitas para implementar este patrón ya forma parte de la base de tu aplicación.

Así que para realizar el mismo ejemplo podemos usar el siguiente código:

        $pipe = app(Pipeline::class);

        $message = $pipe->send('hola mundo')
            ->through([
                ApplyUppercase::class,
                SplitMessage::class,
                RemoveSpaces::class,
                SeparateCharacters::class,
            ])
            ->thenReturn();

       echo $message; //H O L A  M U N D O

En la primera línea tienes que crear una instancia del la clase Pipeline::class.

Posterior a eso usamos el método send para enviar el mensaje u objeto que quieres procesar en las tareas del pipeline.

$message = $pipe->send('hola mundo')

Todas las tareas o acciones las debes declarar en el método through y se ejecutan en el orden que tienen dentro del arreglo.

Este método puede aceptar una sola clase o un arreglo como parámetro, la estructura de las clases la veremos un un momento mas.

->through([
    ApplyUppercase::class,
    SplitMessage::class,
    RemoveSpaces::class,
    SeparateCharacters::class,
])

Finalmente el resultado de todo el proceso lo regresas con el método thenReturn

->thenReturn();

echo $message; //H O L A  M U N D O

Implementación de las acciones

El arreglo de tareas o acciones contiene clases simples que tienen como mínimo el método handle y deben de aceptar dos parámetros; el mensaje que va a procesar y la siguiente tarea en el stack, en este caso la tarea se pasa como un closure.

Veamos un ejemplo de esto con la clase ApplyUppercase.

namespace App\Tasks;

use Closure;

class ApplyUppercase
{
    public function handle($request, Closure $next)
    {
        $message = strtoupper($request);

        return $next($message);
    }
}

En el ejemplo $request contiene el mensaje procesado por la tarea o acción anterior.

Si la clase es la primera acción del arreglo que pasaste al método through, entonces $request recibe el mensaje o el objeto original.

 $message = strtoupper($request);

Para pasar el resultado de la clase, solo tienes que regresar el closure $next pasando como argumento el mensaje o el objeto procesado.

//pasa el mensaje a la siguiente tarea
return $next($message);

Conclusión

En lugar de tener un proceso monolítico plagado de condiciones para aceptar solicitudes y pasarlas a una parte de tu aplicación, puedes componer tareas individuales que aceptan la solicitud, hacen el procesamiento y luego pasan la solicitud a la siguiente etapa.

Esto significa que cada tarea tiene una sola responsabilidad, y es muy fácil añadir, eliminar o reemplazar las tareas a procesar.

En términos generales con el patrón pipeline puedes simplificar un proceso mas complejo descomponiéndolo en acciones o tareas mas especificas y simples.

y que puedes controlar de forma programática.

¿Te gusto el articulo?

Recuerda compartirlo y deja tu comentario