【问题标题】:Where exactly automate injection works in Laravel?Laravel 中的自动化注入到底在哪里工作?
【发布时间】:2020-01-28 11:40:24
【问题描述】:

也许这是一个愚蠢的问题,但官方文档在那个地方对我来说并不清楚。它说依赖注入是自动解决的,例如在控制器中。但是在我的路由中,我将我的路由绑定到一个不从 Controller 类继承的类。和自动注射工作!是不是意味着解析每条路由都会自动使用ServiceContainer并解析依赖关系?

在我们的文档中:

另外,重要的是,您可以在由容器解析的类的构造函数中“类型提示”依赖关系,包括控制器、事件侦听器、中间件等。此外,您可以在排队作业的处理方法中键入提示依赖项。实际上,这就是容器应该如何解析大多数对象的方式。

上面写着“控制器、事件监听器、中间件等等”。您能告诉我其他可以进行自动注射的地方吗?

我正在使用 Laravel >5.8。谢谢。

【问题讨论】:

  • app()->make(MyClass::class) 也将使用依赖注入来解决依赖关系

标签: php laravel dependency-injection


【解决方案1】:

依赖注入取决于您调用函数/方法的方式,而不是函数本身。

[...] 你可以在由容器解析的类的构造函数中“键入提示”依赖项

“由容器解析”意味着你(或者在这种情况下是 Laravel 路由器)正在通过容器调用它。

要自动解析构造函数中的依赖关系,可以使用app()->make()

$myThing = app()->make(MyClass::class);

这将为您提供一个 MyClass 的实例,并解析了构造函数的依赖关系。

要在方法上使用 DI,您可以使用 app()->call()

$result = app()->call([$myThing, 'someMethod']);

一般来说,Laravel 几乎在所有地方都使用 DI。我一直认为它有效,如果无效,您可以简单地手动解决依赖关系。

注意: 基于 Laravel 5.4.26,但大多数(如果不是全部)信息应该仍然正确。

【讨论】:

  • 感谢您的回答。我知道如何使用服务容器手动解决依赖关系。但我想知道 Laravel 什么时候默认使用它。就像我们使用路由时一样,我们的 Controller 类是由容器解析的。但是当我使用“new”关键字创建一个实例时,它不是。我认为它与 Controller 类之后的继承有关。但它会通过容器解决它,即使它是常规的 PHP 类。因此,我尝试扩展我对 Laravel 及其流程的工作原理的了解。
  • DI 不依赖于您要解决其依赖关系的类,只依赖于它的调用方式。它甚至适用于简单的非类函数。 Laravel 会自动将 DI 添加到您通过 Laravel 实例化的几乎所有类或您通过 Laravel 调用的方法中,而不是手动添加,例如路线(包括内联函数)。文档使用“和更多”,因为列出所有案例会很长。如果您在 Laravel 源中搜索 resolve,您会发现其中很多,包括路线、工作、播种机、迁移、验证等等。
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2012-03-23
相关资源
最近更新 更多