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

时间:2018-03-26 04:12:12

标签: php laravel service dependency-injection

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

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

以下是一些示例:

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 个答案:

答案 0 :(得分:4)

好问题!

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

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

  • 您希望将接口绑定到容器,并将其解析为具体类。接口无法直接实例化,因此您必须告诉容器要使用的具体类。

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

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

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

可能是其他一些我忘记的用例或好处,但这些应该是一个好的开始!