为什么Extbase PersistenceManager认为我的对象是新对象?

时间:2019-04-27 16:11:43

标签: typo3 typo3-8.x typo3-extensions

我想更新计划任务中的某些Extbase对象。我正在调用存储库以获取所有对象。然后,我设置该对象的一个​​属性,然后尝试进行更新。 那让我抛出了这个异常

  

用于更新的类型为“ FFPI \ FfpiNodeUpdates \ Domain \ Model \ Node”的对象必须已经保留,但是是新的。

     

vendor / 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()(我得到了仓库,但有例外)
* objectManager-> get()(我得到了仓库,但是有例外)

1 个答案:

答案 0 :(得分:0)

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

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

我希望这对您有帮助^^