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();
。这样做的原因是,在控制器操作中,默认情况下在每个操作结束时调用它作为一种清理任务。默认情况下,您的任务不会执行此操作,因此您需要手动坚持。
我有以下模型:"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();
。这样做的原因是,在控制器操作中,默认情况下在每个操作结束时调用它作为一种清理任务。默认情况下,您的任务不会执行此操作,因此您需要手动坚持。