更好地理解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);
}
我已经在函数中定义了参数,为什么注释会阻塞?我知道这是必要的,但我从来不明白为什么。
答案 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注释。