在调度程序任务中执行存储库功能

时间:2014-01-17 23:11:32

标签: php task typo3 scheduler extbase

目前我有一个调度程序任务,但我想使用我的extbase存储库中的函数(在相同的扩展名中)。

我不断得到“PHP致命错误:在非对象上调用成员函数add()”,无论我如何尝试从extbase包含我的repo或控制器。

我的SampleTask.php:

namespace TYPO3\ExtName\Task;

class SampleTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask {

    public function execute() {
        $controller = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\TYPO3\ExtName\Controller\SampleController');
        $new = new \TYPO3\ExtName\Domain\Model\Sample;
        $new->setName('test');
        $controller->createAction($new);
    }
}

在我的ext_localconf.php中正确定义

有人可以解释我如何从我的SampleTask.php访问我的存储库(或控制器)-extbase。

使用TYPO3 6.2。

谢谢。

1 个答案:

答案 0 :(得分:11)

您收到此php错误,因为您使用makeInstance()实例化了控制器。如果使用makeInstance获取objectManager(\TYPO3\CMS\Extbase\Object\ObjectManager)并使用$objectManager->get('TYPO3\ExtName\Controller\SampleController'),则控制器内的依赖注入将起作用(例如,您的存储库)。

但您可以使用objectManager立即获取存储库,因此您无需调用控制器操作:

这样的事情:

namespace TYPO3\ExtName\Task;

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\ExtName\Domain\Repository\SampleRepository;
use TYPO3\ExtName\Domain\Model\Sample;
use TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface;

class SampleTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask {

    public function execute() {
        $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
        $sampleRepository= $objectManager->get(SampleRepository::class);
        $new = new Sample();
        $new->setName('test');
        $sampleRepository->add($new);
        $objectManager->get(PersistenceManagerInterface::class)->persistAll();
    }
}