我在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
答案 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