✨ 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.