簡體   English   中英

TYPO3:依賴項注入實際上是做什么的,為什么我需要以下代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM