php - Laravel 中的自动化注入到底在哪里工作?
问题描述
也许这是一个愚蠢的问题,但官方文档在那个地方对我来说并不清楚。它说依赖注入是自动解决的,例如在控制器中。但是在我的路由中,我将我的路由绑定到一个不从 Controller 类继承的类。和自动注射工作!这是否意味着解析每条路由都会自动使用 ServiceContainer 并解析依赖关系?
在文档中,我们有:
或者,重要的是,您可以在由容器解析的类的构造函数中“类型提示”依赖关系,包括控制器、事件侦听器、中间件等。此外,您可以在排队作业的处理方法中键入提示依赖项。实际上,这就是容器应该如何解析大多数对象的方式。
它说“控制器、事件侦听器、中间件等等”。你能告诉我其他地方,自动注射有效吗?
我正在使用 Laravel >5.8。谢谢你。
解决方案
依赖注入取决于你如何调用函数/方法,而不是函数本身。
[...]您可以在由容器解析的类的构造函数中“类型提示”依赖项
“由容器解析”意味着您(或者在这种情况下是 Laravel 路由器)正在通过容器调用它。
要自动解决构造函数中的依赖关系,您可以使用app()->make()
:
$myThing = app()->make(MyClass::class);
这将为您提供一个MyClass
解析了构造函数依赖项的实例。
要在方法上使用 DI,您可以使用app()->call()
:
$result = app()->call([$myThing, 'someMethod']);
一般来说,Laravel 几乎在所有地方都使用 DI。我一直认为它可以工作,如果不能,您可以简单地手动解决依赖关系。
推荐阅读
- svg - SVG 内联编辑适用于 Chrome 而不是 FF?
- android - 关于数据绑定、实时数据和可绘制的问题
- r - 我们应该如何选择磁盘框架中的块大小?
- r - 在 Sagemaker 超时时运行 R
- python - 加快音频特征的查询(Spotify Web API)
- c - 在函数内展开 C 数组
- visual-studio - 命名空间“UnityEngine”中不存在 Unity 类型或命名空间名称“Spatial Tracking”
- android - LineBackgroundSpan:PARAGRAPH 跨度必须从段落边界开始错误
- r - R按最小像元大小采样
- c - scanf 忽略回车键并且不改变变量的值