首页 > 解决方案 > 为什么 Extbase PersistenceManager 认为我的对象是新的?

问题描述

我想更新调度程序任务中的一些 Extbase 对象。我正在调用存储库来获取所有对象。然后我设置该对象的一个​​属性,并尝试更新它。这引发了我这个异常

提供给更新的“FFPI\FfpiNodeUpdates\Domain\Model\Node”类型的对象必须已经持久化,但是是新的。

供应商/typo3/cms/typo3/sysext/extbase/Classes/Persistence/Generic/PersistenceManager.php:237

跟踪是:
0:TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
1:TYPO3\CMS\Extbase\Persistence\Repository
2:FFPI\FfpiNodeUpdates\Task\NotificationTask
3:FFPI\FfpiNodeUpdates\Task\NotificationTask
4:TYPO3\ CMS\Scheduler\Scheduler
5: TYPO3\CMS\Scheduler\Controller\SchedulerModuleController
...

我的代码可以缩短到这个

$nodes = $this->nodeRepository->findAll()->toArray();
foreach ($nodes as $node){
    $this->myUpdateFunction($node);
}
private function myUpdateFunction(Node $node)
{
    $node->setOnline(true);
    $this->nodeRepository->update($node); // <- Gives the exception
}

它在 7.6 中运行良好,但在 8.7 中不再运行

我试图通过
* 依赖注入获取存储库(根本不起作用)
* GeneralUtility::makeInstance() (我得到了 repo,但有例外)
* objectManager->get() (我得到了 repo,但有例外)

更新:我在 9.5 版也有这个问题

标签: typo3typo3-8.xtypo3-9.xtypo3-extensions

解决方案


首先你应该只使用 makeInstance() 函数来获取对象管理器,然后你应该使用他而不是 makeInstance() 来处理你的对象。

对于您的主要问题,我不确定它是否有帮助,但您可能必须使用 PersistanceManger->persistAll(); 在其代码中,有一条注释说:“将当前持久会话中的新对象和对对象的更改提交到后端”

我希望这会有所帮助^^


推荐阅读