2 visitas

Patrón Manager en Laravel: Cuándo y Cómo Implementarlo con Servicios

El Patrón Manager permite organizar la lógica de negocio de manera más clara y modular en Laravel. Al separar la orquestación de los servicios en una capa específica, se logra un código más mantenible, testeable y reutilizable. En este artículo, exploraremos qué es, cuándo usarlo y cómo implementarlo paso a paso.

✨ Introducción

En Laravel, la separación de responsabilidades es clave para mantener el código limpio y escalable. Uno de los patrones que podemos aplicar es el Patrón Manager, el cual actúa como una capa intermedia entre los Controllers y los Services.

🔎 ¿Qué es el Patrón Manager?

El Manager es una clase que orquesta múltiples Services y encapsula lógica de negocio más compleja. Esto evita que los Controllers se llenen de lógica y permite que los Services se mantengan enfocados en tareas específicas.

🔍 Cuándo Usarlo

✅ Usar Managers cuando:

  • Se necesita orquestar varios Services.
  • Se requiere centralizar la lógica de negocio más compleja.
  • Se busca mantener los Controllers limpios y enfocados en la petición HTTP.

❌ No usar Managers cuando:

  • La acción es sencilla y puede ser manejada directamente por un Service.
  • Se pueden dividir las responsabilidades sin necesidad de una capa adicional.

🛠️ Implementación en Laravel

1. Helper (Opcional)

Un helper puede encargarse de tareas auxiliares reutilizables.

namespace App\Helpers;

class StringHelper
{
    public static function formatName(string $name): string
    {
        return ucwords(strtolower(trim($name)));
    }
}

2. Service (Lógica específica)

Cada Service se enfoca en una tarea concreta.

namespace App\Services;

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use App\Helpers\StringHelper;

class UserService
{
    public function registerUser(string $nombre, string $email, string $password): User
    {
        $nombreFormateado = StringHelper::formatName($nombre);
        
        return User::create([
            'nombre' => $nombreFormateado,
            'email' => $email,
            'password' => Hash::make($password),
            'activo' => false,
        ]);
    }
}
namespace App\Services;

use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeMail;

class EmailService
{
    public function sendWelcomeEmail(string $email, string $nombre): void
    {
        Mail::to($email)->send(new WelcomeMail($nombre));
    }
}

3. Manager (Orquesta múltiples servicios)

El Manager se encarga de la lógica más compleja y de coordinar los Services.

namespace App\Managers;

use App\Services\UserService;
use App\Services\EmailService;
use App\Models\User;

class UserManager
{
    protected UserService $userService;
    protected EmailService $emailService;

    public function __construct(UserService $userService, EmailService $emailService)
    {
        $this->userService = $userService;
        $this->emailService = $emailService;
    }

    public function registerAndNotifyUser(string $nombre, string $email, string $password): User
    {
        // Crear usuario
        $user = $this->userService->registerUser($nombre, $email, $password);

        // Enviar correo de bienvenida
        $this->emailService->sendWelcomeEmail($user->email, $user->nombre);

        return $user;
    }
}

4. Controller (Usa el Manager en lugar de Services directamente)

namespace App\Http\Controllers;

use App\Managers\UserManager;
use Illuminate\Http\Request;

class UserController extends Controller
{
    protected UserManager $userManager;

    public function __construct(UserManager $userManager)
    {
        $this->userManager = $userManager;
    }

    public function store(Request $request)
    {
        $user = $this->userManager->registerAndNotifyUser(
            $request->input('nombre'),
            $request->input('email'),
            $request->input('password')
        );

        return response()->json($user, 201);
    }
}

📊 Beneficios del Patrón Manager

  • 📅 Más mantenible: Se evita que los Controllers crezcan demasiado.
  • 🛠️ Mejor organización: Se separa la lógica en capas claras.
  • 💪 Reutilizable: Los Services pueden ser utilizados por otros Managers sin modificar su código.
  • ✅ Más testeable: Se pueden hacer pruebas unitarias a los Services y Managers por separado.

📝 Conclusión

El Patrón Manager en Laravel es una gran solución para organizar lógica compleja. Si bien no siempre es necesario, cuando tu aplicación crece, ayuda a mantener una estructura escalable y desacoplada.

Si querés aplicar este patrón, asegurate de no abusar de los Managers, y mantené los Services lo más específicos posible.

🌟 ¿Ya usaste el Patrón Manager en tus proyectos? Contame en los comentarios.

Patrón Manager en Laravel: Cuándo y Cómo Implementarlo con Servicios
10 March 2025

Me dedico a crear soluciones web eficientes y a compartir mi conocimiento con la comunidad de desarrolladores.

Alejandro Leone
Backend Developer