【问题标题】:Why does the Extbase PersistenceManager think that my object is new?为什么 Extbase PersistenceManager 认为我的对象是新的?
【发布时间】:2019-09-16 20:14:27
【问题描述】:

我想更新调度程序任务中的一些 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()(我得到了 repo,但有例外)
* objectManager->get() (我得到了 repo,但有例外)

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

【问题讨论】:

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


    【解决方案1】:

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

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

    希望对你有帮助^^

    【讨论】:

    • 只有在我更新我的对象后才能使用 Persist all,否则它是无用的。问题是我的对象 不是新的,但 PersistenceManager 声称它是新的。
    • @kevinq 有什么解决方案吗?我也有同样的问题。
    • @MithunJack 是的,现在。它目前正在工作,但我不知道我做了什么。你可以在这里查看代码和提交历史github.com/freifunk-pinneberg/typo3-tx_ffpi_node_updates/blob/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    相关资源
    最近更新 更多