ExtBase: невозможно удалить дочерний объект в задаче планировщика

У меня есть следующая модель: "Полка" и "Книга", находящиеся в соотношении 1:n.

Также есть задача планировщика (расширение "планировщик" 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.


person firelex    schedule 28.04.2016    source источник


Ответы (1)


Вам нужно создать экземпляр PersistenceManager, а затем вызвать PersistenceManager->persistAll();. Причина этого в том, что внутри действия контроллера это вызывается по умолчанию в конце каждого действия как своего рода задача очистки. Ваша задача не будет делать этого по умолчанию, поэтому вам нужно сохранить ее вручную.

person sven    schedule 29.04.2016
comment
Большой! Вот оно. Большое спасибо. - person firelex; 29.04.2016