ExtBase:无法删除调度程序任务中的子对象

ExtBase: cannot delete child object in scheduler task

我有以下模型:"Shelf" 和 "Book",处于 1:n 关系。

还有一个调度任务(扩展"scheduler"6.2.0)分析书籍并删除它们。调度任务分为两部分类:任务本身和它的业务逻辑。

任务:

namespace Vendor\MyExt\Scheduler;
class MultiStepProcessTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask {
    public function execute() {
        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');

        $businessLogic = $objectManager->get(\Vendor\MyExt\Scheduler\MultiStepProcessTaskBusinessLogic::class);

        return $businessLogic->run();
    }
}

业务逻辑:

namespace Vendor\MyExt\Scheduler;
class MultiStepProcessTaskBusinessLogic {
    public function run() {
        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');

        $shelvesRepository = $objectManager->get('Vendor\MyExt\Domain\Repository\ShelvesRepository');
        $shelf = $shelvesRepository->findOneByLastFinishedTaskNumber(0);
        $book = $shelf->getBooks()->current();
        ....    
        $shelf->removeBook($book);
        $shelvesRepository->update($shelf);

        return 1;
    }
}

如果从我的分机呼叫 - 一切正常:图书已删除。 为了测试它,我将这些行放入一个控制器的列表操作中:

$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$businessLogic = $objectManager->get(\Vendor\MyExt\Scheduler\MultiStepProcessTaskBusinessLogic::class);
$businessLogic->run();

如果从调度程序调用(作为任务),书不会被删除!创建存储库,获取书架,获取书籍。但是 $shelf->removeBook($book); 根本没有效果。有人可以解释一下为什么吗?

我使用的是 TYPO3 版本 6.2.19

您需要实例化 PersistenceManager,然后调用 PersistenceManager->persistAll();。这样做的原因是,在控制器操作中,默认情况下在每个操作结束时调用它作为一种清理任务。默认情况下,您的任务不会执行此操作,因此您需要手动坚持。