构造函数注入在 TYPO3 Extbase 中如何工作?

How does constructor injection work in TYPO3 Extbase?

我刚刚意识到 TYPO3 Extbase 可以(在某些情况下?)注入依赖项,即使您在调用时没有将它们传递给构造函数,例如$objectManager->get(Foo::class)?我很困惑这是如何以及何时工作的。自己看源码也找不到答案

看看\TYPO3\CMS\Extbase\Object\Container\Container::getConstructorArguments()

它的工作原理如下:

如果

  • 调用 ObjectManager->get()
  • 时未提供参数
  • 没有默认值(在构造函数签名中,即设置$argumentInformation['defaultValue']时)和
  • 所需的参数是 class(即设置 $argumentInformation['dependency'] 时)

然后这个 class 将被实例化并作为参数提供给构造函数调用

它在 Extbase Framework 中的很多 类 中都有效。您只需要在声明上方的属性上添加@inject 注解即可。

/**
     * myRepository
     *
     * @var \TGM\Extension\Domain\Repository\MyRepository
     * @inject
     */
    protected $myRepository= NULL;

这在 undko 告诉的依赖项下工作,例如 ActionControllers、模型、存储库、CommandController 等。