Typo3 6.2.14 @inject存储库

时间:2015-08-22 10:11:09

标签: typo3-6.2.x

我在Typ3 6.2.14下使用扩展构建器创建了一个扩展。 一切都运行正常,但现在我遇到了@inject的问题,我在WEB中发现了很多提示,但没有什么对我有用。

我正在使用2种模式(植物和种类选择)。第一个,一切正常,

$plants = $this->plantRepository->findAll();

但是第二个

$speciesSelectAll = $this->speciesSelectRepository->findAll();

我总是得到:"Call to a member function findAll() on a non-object.” 但真正奇怪的是,我以相同的方式对两个模型使用'@inject'。

/**
 * plantRepository
 * 
 * @var \HGA\Hgaplantdb\Domain\Repository\PlantRepository
 * @inject
 */
protected $plantRepository = NULL;

这是第二个:

   /**
 * speciesSelectRepository
 * 
 * @var \HGA\Hgaplantdb\Domain\Repository\SpeciesSelectRepository
 * @inject
 */
protected $speciesSelectRepository = NULL;

对于植物来说,它的工作正常,对于物种选择不是。

我也刷新了所有缓存。我还删除了typo3temp \ Cache下的所有内容,没有任何成功。

Themn我尝试测试存储库变量,如下所示。

    if ($speciesSelectRepository == NULL) {
        error_log('speciesSelectRepository is NULL', 0);
    } else {
        error_log('speciesSelectRepository is not NULL', 0);

在两个模型的error_log中,我总是发现..是NULL。但奇怪的是,植物的findAll()函数可以工作,但对于物种选择不行!

唯一的区别是,对于speciesSelect我会进行手动调用。

$speciesC = new \HGA\Hgaplantdb\Controller\SpeciesSelectController();
$speciesC->speciesArrayAction();

使用new()可能有问题吗? @inject是否有额外的东西,我必须关心它?

我知道,在这个论坛上经常会找到@inject问题,但没有什么对我有用。即使它适用于植物,但不适用于物种。选择对我来说是不可理解的。

先谢谢你的帮助,

Hans-Georg

1 个答案:

答案 0 :(得分:2)

如果代码如下:

/**
 * speciesSelectRepository
 * 
 * @var \HGA\Hgaplantdb\Domain\Repository\SpeciesSelectRepository
 * @inject
 */
protected $speciesSelectRepository = NULL;

...位于\HGA\Hgaplantdb\Controller\SpeciesSelectController内,您使用new关键字创建此控制器的新时刻,然后不会调用@inject

相反,你应该使用:

$this->objectManager->get('\\HGA\\Hgaplantdb\\Controller\\SpeciesSelectController')

以上功能负责注释的注入。使用ExtBase时,应始终使用上面而不是new关键字。

更新

  

嗨Lasse,我不明白为什么,但它解决了我的问题。非常感谢Hans-Georg

您必须了解@inject@lazy或任何其他注释只是PHP DocBlock(评论),并且它们没有神奇地做任何事情。因此,如果使用new关键字初始化对象,则该属性将具有您为其指定的值:null

但是,如果使用以下方法之一初始化对象:

$this->objectManager->get('\\HGA\\Hgaplantdb\\Controller\\SpeciesSelectController')

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\\HGA\\Hgaplantdb\\Controller\\SpeciesSelectController')

...然后在清除缓存后它应该有效。

这些方法会查看您的PHP DocBlocks,如果他们找到了他们认可的语法,那么他们就会做出魔术。在大多数情况下,我会建议您在objectManager可用时使用$this->objectManager->get(),它在您扩展的大多数ExtBase类中。否则使用另一个。

$this->objectManager->get documentation

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance documentation