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.
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.
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.
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)));
}
}
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));
}
}
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;
}
}
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);
}
}
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.
Me dedico a crear soluciones web eficientes y a compartir mi conocimiento con la comunidad de desarrolladores.