[英]TYPO3: What does dependency injection actually do and why do i need the following code?
一個更好地了解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);
}
我已經在函數中定義了參數,那么為什么注釋塊呢? 我知道這是必要的,但我從來不明白為什么。
依賴注入與TCA或數據庫無關。 這甚至不是TYPO3本身的事情,而是TYPO3用來在運行時將類外部環境中可用的其他對象的實例注入到類/對象中的概念。 它基本上與類可比,該類的構造函數定義了所需的對象的參數。 因此,有人可能會說@inject
注釋與@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
開頭的方法的期望值。 如果存在參數類型類的相應對象,或者將創建類的實例並將其提供給注入方法,則將收集它們,從而為類提供了隨時可用的對象。
您不需要兩者。 如果提供@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批注。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.