TYPO3:依赖注入实际上做了什么以及为什么我需要以下代码?

时间:2018-01-10 09:32:31

标签: dependency-injection typo3

更好地理解TYPO3的一个小问题:

在我的控制器中,我有以下代码:

 /**
     * applianceRepository
     *
     * @var \Cjk\Icingaconfgen\Domain\Repository\ApplianceRepository
     * 
     * @inject
     */
    protected $applianceRepository = null;

关于整个依赖注入......假设注入从我的TCA文件中获取该特定类的依赖关系是否正确?或者依赖注入实际上做了什么?根据我的理解,只有在执行以下代码时才会发生与MySQL数据库中表的连接:

 public function listAction()
    {
        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
        $apprep = $objectManager->get(\Cjk\Icingaconfgen\Domain\Repository\ApplianceRepository::class);
        $appliances = $apprep->findAll();
        $this->view->assign('appliances', $appliances);
}

那么依赖注入实际上做了什么以及为什么有必要呢?

编辑:作为一个额外的问题......以下代码做了什么或更确切地说"为什么我需要注释块中的符号?"。

 /**
     * action show
     *
     * @param \Cjk\Icingaconfgen\Domain\Model\Appliance $appliance
     * @return void
     */
    public function showAction(\Cjk\Icingaconfgen\Domain\Model\Appliance $appliance)
    {
        $this->view->assign('appliance', $appliance);
    }

我已经在函数中定义了参数,为什么注释会阻塞?我知道这是必要的,但我从来不明白为什么。

2 个答案:

答案 0 :(得分:1)

依赖注入与TCA或数据库无关。它甚至不是TYPO3本身,而是TYPO3用于将类的外部世界中可用的其他对象的实例注入到运行时的类/对象中的概念。 它基本上与类相当,构造函数定义了它所需的对象参数。 所以有人可能会说@inject注释与此类似的没什么不同:

class SomeController {
    /**
     * @var SomeClass
     * @inject
     */
    protected $someClassDependency;
}

// this is equal to

class SomeController {
    protected $someClassDependency;
    public function __construct(SomeClass $someClassDependency) {
        $this->someClassDependency = $someClassDependency;
    }
}

// and also equal to

class SomeController {
    protected $someClassDependency;
    public function injectSomeClassDependency(SomeClass $someClassDependency) {
        $this->someClassDependency = $someClassDependency;
    }
}

此注入的主要内容是自动化过程,当TYPO3通过其内部GeneralUtility::makeInstance方法构造类的实例时,该过程检测需要注入哪些对象。 将检查所有@inject注释,TYPO3然后将注入方法(如我的代码示例中的方法)插入到您的类的新生成的PHP代码中。然后它执行您的类的“更新”PHP代码,并在您的类对象的实例化时,将检查以inject开头的所有方法作为参数。如果存在参数类型类的相应对象,或者将创建类的实例并将其提供给注入方法,则将收集它们的相应对象,从而为您的类提供随时可用的对象。

答案 1 :(得分:0)

你不需要两者。如果您提供@inject注释,它将自动为您实例化(如您的示例中所示):

/**
 * applianceRepository
 *
 * @var \Cjk\Icingaconfgen\Domain\Repository\ApplianceRepository
 * 
 * @inject
 */
 protected $applianceRepository;


 ...
 $this->applianceRepository->findAll();

另一种方法是这样做:

/**
 * @param \Cjk\Icingaconfgen\Domain\Repository\ApplianceRepository $applianceRepository
 */ 
public function injectApplianceRepository($applianceRepository)
{
    $this->applianceRepository = $applianceRepository;
}

您可能想要这样做的原因是一些人提到的性能原因。如果性能不是您的问题,您可以放心地忽略它并使用@inject注释。

相关问题