Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel service class can work even without service provider?

When implementing a service, base on Laravel's documentation, a service should be registered on the service provider so it could be injected into a class via dependency injection. But I do notice that even though I do not create a service provider as such, I could still inject that class.

If so, what's the use of the service provider class if I could just directly inject it?

Here's some sample:

use App\Http\Service\MailerService;

class MailerServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(MailerService::class, function($app) {
            return new MailerService();
        });
    }
}

class MailerService
{
    public function send()
    {
        // do something here
    }
}

class MailerController
{
    public function sendEmail(MailerService $mailerService)
    {
        $mailerService->send();
    }
}
like image 436
basagabi Avatar asked Oct 14 '25 03:10

basagabi


1 Answers

Good question!

Laravel's Container has the ability to "auto-resolve" dependencies. If you ask the Container to create an instance of a class and there is no specific binding definition for the class, the Container will attempt to find the class, use PHP's Reflection functionality to check its dependencies, and recursively build the dependency tree until it's finished or runs into a problem.

The use-cases and benefits of using a Service Provider even with this capability:

  • You want to bind an Interface to the container, and have it resolved to a concrete class. Interfaces can't be instantiated directly, so you have to tell the container what concrete class to use.

  • Your binding has a non-class dependency, such as a string config value. These can't be auto-resolved.

  • Auto-wiring is slow. It has to use Reflection for every class that doesn't have a service provider binding.

  • You want to include some sort of logic in the resolution process.

Might be a couple other use cases or benefits I'm forgetting, but those should be a good start!

like image 143
Aken Roberts Avatar answered Oct 17 '25 11:10

Aken Roberts