Laravel Dependancy Injection无法正常工作

时间:2016-07-09 18:06:32

标签: php laravel dependency-injection

有人可以帮助我,一切看起来都很正常,但依赖注入不适用于我的班级。

enter image description here

在注册此服务提供商时,我告诉Laravel博客是一个单身人士,并且从阅读文档时,这应该允许它在我第41行时解决。

但它给出了一个错误说明如下:

Argument 1 passed to 
Aaranmcguire\Blog\Providers\AppServiceProvider::setSettings() must 
be an instance of Aaranmcguire\Blog\Blog, none given, called in 
.../aaranmcguire/Blog/src/Providers/AppServiceProvider.php 
on line 25 and defined

如果我删除第41行,那么我可以在应用程序中成功DD该类,确认其已注册。

我在这上面花了将近一个小时的想法?

2 个答案:

答案 0 :(得分:2)

您正在混合绑定和方法注入。

绑定(单身):

public function register() {
    $this->app->singleton('blog', function () {
        return new \Blog();
    });
}

public function setSettings() {
    dd($this->app->blog);
}

方法注入:

public function setSettings(\Blog $blog) {
    dd($blog);
}

编辑:修复代码。

答案 1 :(得分:2)

仅在使用IoC / Service容器解析类或调用方法时才会发生依赖注入。如果您自己调用方法并且它需要参数,则必须传递这些参数。 Laravel并没有改变PHP的工作方式。

这些都不会涉及依赖注入,因为它们是对象的直接方法调用而不使用容器:

$this->anything(); // just a method call
$something->anything(); // just another method call

您将获得注入构造函数依赖项的原因是因为使用IoC容器解析了这些特定类。通常框架是这种代码的调用者,而不是你直接。当框架在类上调用方法时,它可以使用容器进行调用,这是Method Injection发挥作用的地方。

容器的call方法带注释:

  

“调用给定的Closure / class @方法并注入其依赖项。”

通过IoC容器调用服务提供程序的boot方法,该方法将根据服务提供商上的Laravel文档注入依赖项。

  

“您可以为服务提供商的启动方法键入提示依赖关系。服务容器将自动注入您需要的任何依赖项......”   Laravel 5.2 Docs - Service Providers - The Boot method

来自Illuminate\Foundation\Application@bootProvider

protected function bootProvider(ServiceProvider $provider)
{
    if (method_exists($provider, 'boot')) {
        return $this->call([$provider, 'boot']);
    }
}

应用程序使用call方法在提供程序上调用boot方法,这就是为boot方法键入提示参数并获取方法注入的原因。它不直接在提供者对象上调用boot,而是使用容器来调用它。

要使用容器的功能,必须使用容器。

- 这是引用Laravel 5.2,但IoC在版本中非常相似。