Laravel的服务类即使没有服务提供者也可以工作吗?

3
当实现一个服务时,基于 Laravel 的文档,应该在服务提供者上注册服务,这样它就可以通过依赖注入被注入到类中。但是我注意到,即使我没有创建一个服务提供者,我仍然可以注入那个类。
如果是这样,如果我可以直接注入它,那么服务提供者类有什么用处呢?
以下是一些示例:
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();
    }
}
1个回答

8

好问题!

Laravel的Container具有“自动解析”依赖项的能力。如果您要求容器创建类的实例,而没有针对该类的特定绑定定义,则容器将尝试查找类,使用PHP的反射功能检查其依赖项,并递归构建依赖关系树,直到完成或遇到问题。

即使具备这种功能,使用Service Provider的用例和优点如下:

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

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

  • 自动装配速度较慢。它必须为每个没有服务提供商绑定的类使用Reflection。

  • 您想在解析过程中包含某种逻辑。

可能还有一些我忘记的用例或好处,但那应该是一个好的开始!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接