Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typo3 v7中的类型3 Extbase依赖项注入错误/错误?_Typo3_Extbase_Typo3 7.6.x - Fatal编程技术网

Typo3 v7中的类型3 Extbase依赖项注入错误/错误?

Typo3 v7中的类型3 Extbase依赖项注入错误/错误?,typo3,extbase,typo3-7.6.x,Typo3,Extbase,Typo3 7.6.x,我目前正在升级extbase扩展,使其与TYPO3 v7兼容, 还有一个非常奇怪的extbase行为,我完全不知道 在BackendController中,必须更新衍生模型, 看起来是这样的: /** * action update * * @param \Vendor\MyExt\Domain\Model\Thing $thing * @return void */ public function updateAction(\Vendor\MyExt\Domain\Model\Thi

我目前正在升级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)
显示了相应的对象,
Vendor\MyExt\Domain\Model\typewhere

在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,通过installtool清除所有缓存。)


先谢谢你。

首先。。。让我们做些清理

我建议您使用存储库的注入:

/**
 * seminarRepository
 *
 * @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
 */
protected $typeWhateverRepository;

/**
 * @param \Vendor\MyExt\Domain\Repository\TypeWhateverRepository $typeWhateverRepository
 */
public function injectTypeWhateverRepository(TypeWhateverRepository $typeWhateverRepository)
{
  $this->typeWhateverRepository= $typeWhateverRepository;
}
/**
 * @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;
}
然后我将使用
Thing
Type
的关系,这样您就不必从存储库中获取这些:

/**
 * seminarRepository
 *
 * @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
 */
protected $typeWhateverRepository;

/**
 * @param \Vendor\MyExt\Domain\Repository\TypeWhateverRepository $typeWhateverRepository
 */
public function injectTypeWhateverRepository(TypeWhateverRepository $typeWhateverRepository)
{
  $this->typeWhateverRepository= $typeWhateverRepository;
}
/**
 * @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,
  ],
],

首先。。。让我们做些清理

我建议您使用存储库的注入:

/**
 * seminarRepository
 *
 * @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
 */
protected $typeWhateverRepository;

/**
 * @param \Vendor\MyExt\Domain\Repository\TypeWhateverRepository $typeWhateverRepository
 */
public function injectTypeWhateverRepository(TypeWhateverRepository $typeWhateverRepository)
{
  $this->typeWhateverRepository= $typeWhateverRepository;
}
/**
 * @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;
}
然后我将使用
Thing
Type
的关系,这样您就不必从存储库中获取这些:

/**
 * seminarRepository
 *
 * @var \Vendor\MyExt\Domain\Repository\TypeWhateverRepository
 */
protected $typeWhateverRepository;

/**
 * @param \Vendor\MyExt\Domain\Repository\TypeWhateverRepository $typeWhateverRepository
 */
public function injectTypeWhateverRepository(TypeWhateverRepository $typeWhateverRepository)
{
  $this->typeWhateverRepository= $typeWhateverRepository;
}
/**
 * @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打字脚本设置缺少子类定义(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
         }
    }
}
还要注意,类必须在模型文件中有一个适当的“扩展”定义


我仍然想知道为什么它能在v6中工作——不过没关系。

解决这个问题的方法很简单,但很难找到,因为我正在进行扩展更新

extbase打字脚本设置缺少子类定义(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
         }
    }
}
还要注意,类必须在模型文件中有一个适当的“扩展”定义


我仍然想知道为什么它能在v6中工作——但无论如何。

在您的上一个代码中,它肯定是$this->typeWhateverRepository而不是$typeWhateverRepository仍然不走运,调用了错误的模型。在您的上一个代码中,它肯定是$this->typeWhateverRepository而不是$typeWhateverRepository仍然不走运,呼叫错误的型号。首先,感谢您的快速响应!存储库已按您所述注入,但问题仍然存在。我现在得试试关系的东西了。首先,谢谢你的快速回复!存储库已按您所述注入,但问题仍然存在。我现在得试一下关系。