Php 即使没有服务提供商,Laravel服务类也可以工作?

Php 即使没有服务提供商,Laravel服务类也可以工作?,php,laravel,service,dependency-injection,Php,Laravel,Service,Dependency Injection,在实现基于的服务时,应该在服务提供者上注册服务,以便通过依赖项注入将其注入到类中。但我注意到,即使我没有创建这样的服务提供者,我仍然可以注入该类 如果是这样的话,如果我可以直接注入服务提供者类,它有什么用呢 以下是一些示例: use App\Http\Service\MailerService; class MailerServiceProvider extends ServiceProvider { public function register() { $

在实现基于的服务时,应该在服务提供者上注册服务,以便通过依赖项注入将其注入到类中。但我注意到,即使我没有创建这样的服务提供者,我仍然可以注入该类

如果是这样的话,如果我可以直接注入服务提供者类,它有什么用呢

以下是一些示例:

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();
    }
}
好问题

Laravel的容器能够“自动解析”依赖项。如果您要求容器创建一个类的实例,但该类没有特定的绑定定义,那么容器将尝试查找该类,使用PHP的反射功能检查其依赖关系,并递归地构建依赖关系树,直到完成或遇到问题为止

使用具有此功能的服务提供商的用例和好处:

  • 您希望将接口绑定到容器,并将其解析为具体类。接口不能直接实例化,所以您必须告诉容器要使用哪个具体类

  • 绑定具有非类依赖项,例如字符串配置值。这些问题无法自动解决

  • 自动布线速度慢。它必须对每个没有服务提供者绑定的类使用反射

  • 您希望在解析过程中包含某种逻辑

可能还有一些其他的用例或好处我都忘了,但这些应该是一个好的开始