有人可以帮助我,一切看起来都很正常,但依赖注入不适用于我的班级。
在注册此服务提供商时,我告诉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该类,确认其已注册。
我在这上面花了将近一个小时的想法?
答案 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在版本中非常相似。