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).
    Ejemplos típicos de nombres y ubicación:

    app/Services/
    ├── UserRegistrationService.php
    ├── PaymentProcessingService.php
    ├── ReportGeneratorService.php
    ├── InvoiceSenderService.php
    ├── NotificationService.php
    
    Ejemplo:

    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)