v7 中的 TYPO3 Extbase 依赖注入 Error/Bug?
TYPO3 Extbase Dependency Injection Error/Bug in v7?
我目前正在升级一个 extbase 扩展以兼容 TYPO3 v7,
并且有一个非常奇怪的 extbase 行为我根本不知道。
在 BackendController 中,必须更新派生模型,
看起来像这样:
/**
* action update
*
* @param \Vendor\MyExt\Domain\Model\Thing $thing
* @return void
*/
public function updateAction(\Vendor\MyExt\Domain\Model\Thing $thing) {
if ($this->request->hasArgument('exit')) {
$this->redirect('list');
exit;
}
$this->setFalItems($thing);
$this->updateStuff($thing);
$this->updateTypeModel($thing);
//...
}
protected function updateTypeModel( \Vendor\MyExt\Domain\Model\Thing $thing ) {
//...
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$mytypeRepository = $this->objectManager->get('Vendor\MyExt\Domain\Repository\TypeWhateverRepository');
$typeModel = $mytypeRepository->findByUid( $TypeId );
//...
在v6中,vardump( $typemodel )
显示了对应的Object,
Vendor\MyExt\Domain\Model\TypeWhatever
在 v7 中,vardump( $typemodel )
显示父对象,
Vendor\MyExt\Domain\Model\Thing
为什么它在 v6 中有效?
为什么完全相同的代码不再适用于 v7?
[晚上梦到可怕的虫子]
我挖得更深了一点,这个问题在某种程度上与依赖注入有关。:
/**
* typeWhateverRepository
*
* @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
* @inject
*/
protected $typeWhateverRepository;
protected function updateTypeModel(\Vendor\MyExt\Domain\Model\Thing $thing) {
// $typeWhateverRepository = $this->objectManager->get('Vendor\MyExt\Domain\Repository\TypeWhateverRepository');
$typeModel = $this->typeWhateverRepository->findByUid($thing->getTypeId());
-> still the same problem,
-> Call to undefined method Vendor\MyExt\Domain\Model\Thing::setWhatever()
所以,DI 根本不起作用,Grmpf。
获得正确的 DI 还需要哪些其他先决条件?
(顺便说一句,在测试之间,我卸载并重新安装了 ext,通过安装工具清除了所有缓存。)
提前谢谢你。
首先...让我们做一些清理...
我建议使用您存储库的注入:
/**
* seminarRepository
*
* @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
*/
protected $typeWhateverRepository;
/**
* @param \Vendor\MyExt\Domain\Repository\TypeWhateverRepository $typeWhateverRepository
*/
public function injectTypeWhateverRepository(TypeWhateverRepository $typeWhateverRepository)
{
$this->typeWhateverRepository= $typeWhateverRepository;
}
然后我会使用从 Thing
到 Type
的关系,这样您就不必从您的存储库中获取这些:
/**
* @lazy
* @var \Vendor\MyExt\Domain\Model\TypeWhatever
*/
protected $typeWhatever = null;
/**
* @return \Vendor\MyExt\Domain\Model\TypeWhatever $typeWhatever
*/
public function getTypeWhatever()
{
return $this->typeWhatever;
}
/**
* @param \Vendor\MyExt\Domain\Model\TypeWhatever $typeWhatever
*
* @return void
*/
public function setTypeWhatever(TypeWhatever $typeWhatever)
{
$this->typeWhatever = $typeWhatever;
}
在你的 TCA 中放置比:
'type_whatever' => [
'exclude' => 0,
'label' => 'LLL:EXT:my_ext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_thing.type_whatever',
'config' => [
'type' => 'select',
'foreign_table' => 'tx_myext_domain_model_typewhatever',
'items' => [
['LLL:EXT:my_ext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_thing.choose', 0],
],
'minitems' => 1,
'maxitems' => 1,
],
],
这个问题的解决方案很简单,但很难找到,因为我正在进行扩展更新。
extbase-typoscript 设置缺少子classes 定义 m)
extbase 设置通常在文件中找到
typo3conf/ext/my_ext/Configuration/TypoScript/setup.txt
:
config.tx_extbase.persistence.classes {
Vendor\MyExt\Domain\Model\Thing {
subclasses {
0 = Vendor\MyExt\Domain\Model\TypeWhatever
}
}
}
另请注意,class 有必要在模型文件中具有适当的 'extends' 定义。
我仍然想知道为什么它在 v6 中完全有效 - 但是,没关系。
我目前正在升级一个 extbase 扩展以兼容 TYPO3 v7, 并且有一个非常奇怪的 extbase 行为我根本不知道。
在 BackendController 中,必须更新派生模型, 看起来像这样:
/**
* action update
*
* @param \Vendor\MyExt\Domain\Model\Thing $thing
* @return void
*/
public function updateAction(\Vendor\MyExt\Domain\Model\Thing $thing) {
if ($this->request->hasArgument('exit')) {
$this->redirect('list');
exit;
}
$this->setFalItems($thing);
$this->updateStuff($thing);
$this->updateTypeModel($thing);
//...
}
protected function updateTypeModel( \Vendor\MyExt\Domain\Model\Thing $thing ) {
//...
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$mytypeRepository = $this->objectManager->get('Vendor\MyExt\Domain\Repository\TypeWhateverRepository');
$typeModel = $mytypeRepository->findByUid( $TypeId );
//...
在v6中,vardump( $typemodel )
显示了对应的Object,Vendor\MyExt\Domain\Model\TypeWhatever
在 v7 中,vardump( $typemodel )
显示父对象,Vendor\MyExt\Domain\Model\Thing
为什么它在 v6 中有效? 为什么完全相同的代码不再适用于 v7?
[晚上梦到可怕的虫子]
我挖得更深了一点,这个问题在某种程度上与依赖注入有关。:
/**
* typeWhateverRepository
*
* @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
* @inject
*/
protected $typeWhateverRepository;
protected function updateTypeModel(\Vendor\MyExt\Domain\Model\Thing $thing) {
// $typeWhateverRepository = $this->objectManager->get('Vendor\MyExt\Domain\Repository\TypeWhateverRepository');
$typeModel = $this->typeWhateverRepository->findByUid($thing->getTypeId());
-> still the same problem,
-> Call to undefined method Vendor\MyExt\Domain\Model\Thing::setWhatever()
所以,DI 根本不起作用,Grmpf。 获得正确的 DI 还需要哪些其他先决条件?
(顺便说一句,在测试之间,我卸载并重新安装了 ext,通过安装工具清除了所有缓存。)
提前谢谢你。
首先...让我们做一些清理...
我建议使用您存储库的注入:
/**
* seminarRepository
*
* @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
*/
protected $typeWhateverRepository;
/**
* @param \Vendor\MyExt\Domain\Repository\TypeWhateverRepository $typeWhateverRepository
*/
public function injectTypeWhateverRepository(TypeWhateverRepository $typeWhateverRepository)
{
$this->typeWhateverRepository= $typeWhateverRepository;
}
然后我会使用从 Thing
到 Type
的关系,这样您就不必从您的存储库中获取这些:
/**
* @lazy
* @var \Vendor\MyExt\Domain\Model\TypeWhatever
*/
protected $typeWhatever = null;
/**
* @return \Vendor\MyExt\Domain\Model\TypeWhatever $typeWhatever
*/
public function getTypeWhatever()
{
return $this->typeWhatever;
}
/**
* @param \Vendor\MyExt\Domain\Model\TypeWhatever $typeWhatever
*
* @return void
*/
public function setTypeWhatever(TypeWhatever $typeWhatever)
{
$this->typeWhatever = $typeWhatever;
}
在你的 TCA 中放置比:
'type_whatever' => [
'exclude' => 0,
'label' => 'LLL:EXT:my_ext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_thing.type_whatever',
'config' => [
'type' => 'select',
'foreign_table' => 'tx_myext_domain_model_typewhatever',
'items' => [
['LLL:EXT:my_ext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_thing.choose', 0],
],
'minitems' => 1,
'maxitems' => 1,
],
],
这个问题的解决方案很简单,但很难找到,因为我正在进行扩展更新。
extbase-typoscript 设置缺少子classes 定义 m)
extbase 设置通常在文件中找到typo3conf/ext/my_ext/Configuration/TypoScript/setup.txt
:
config.tx_extbase.persistence.classes {
Vendor\MyExt\Domain\Model\Thing {
subclasses {
0 = Vendor\MyExt\Domain\Model\TypeWhatever
}
}
}
另请注意,class 有必要在模型文件中具有适当的 'extends' 定义。
我仍然想知道为什么它在 v6 中完全有效 - 但是,没关系。