SERVICES EN LARAVEL
Cuando se habla de servicios, en Laravel se refiere a dos conceptos diferentes pero relacionados:- Service Providers: Son las clases que configuran y arrancan toda la aplicación Laravel. Son las encargadas de registrar cosas en el Service Container. Laravel usa varios Service Providers internamente (para rutas, autenticación, sesiones, mail, cola, cache, etc.). También se pueden crear configurar paquetes o funcionalidades propias del proyecto. Se registran en "bootstrap/providers.php (Laravel 11+)" o en "config/app.php → 'providers'". Ejemplo:
namespace App\Providers; use Illuminate\Support\ServiceProvider; class MiServicioProvider extends ServiceProvider { public function register() { // Aquí se hacen bindings (enlaces) en el contenedor $this->app->singleton(MiServicioDePagos::class, function ($app) { return new MiServicioDePagos(config('pagos.api_key')); }); } public function boot() { // Aquí se hace configuración que necesita que todo ya esté registrado // Ejemplo: macros, vistas, eventos, etc. \Blade::directive('euro', fn ($money) => " <?php echo number_format($money, 2) . ' €'; ? >"); } } - Service Classes: Son clases normales donde se pone lógica de negocio compleja que no se quiere tener en los controladores ni en los modelos. Objetivo principal:
- Mantener los controladores limpios (thin controllers).
- Reutilizar lógica en varios lugares.
- Separar responsabilidades (siguiendo principios SOLID).
Ejemplo:app/Services/ ├── UserRegistrationService.php ├── PaymentProcessingService.php ├── ReportGeneratorService.php ├── InvoiceSenderService.php ├── NotificationService.php
namespace App\Services; use App\Models\User; use App\Repositories\UserRepository; use Illuminate\Support\Facades\Hash; class UserRegistrationService { protected $userRepo; public function __construct(UserRepository $userRepo) { $this->userRepo = $userRepo; } public function register(array $data): User { // Lógica de negocio compleja if ($this->userRepo->existsByEmail($data['email'])) { throw new \Exception('El email ya está registrado'); } $user = $this->userRepo->create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); // Enviar email de bienvenida, asignar rol, etc. event(new UserRegistered($user)); return $user; } } //Uso en el controlador public function store(Request $request, UserRegistrationService $service) { $user = $service->register($request->validated()); return response()->json($user, 201); }
Comparación: ¿Cuál es cuál?
| Concepto | Nombre oficial | Propósito principal | Dónde se crea normalmente | Hereda de... | Se registra en contenedor? |
|---|---|---|---|---|---|
| Service Provider | Service Provider | Configurar la app + bindings | app/Providers/ | ServiceProvider | Sí (en providers) |
| Service Class | Service / Application Service | Lógica de negocio reusable | app/Services/ o app/Domain/ | Nada (clase normal) | Opcional (puedes bindearla) |