在调度任务中执行仓库函数。

9

目前我有一个定时任务,但我想要使用我的Extbase存储库(在同一扩展中)中的函数。

无论我如何尝试包含我的Repo或从Extbase控制器中导入它,我都会收到“PHP致命错误:在非对象上调用成员函数add()”。

我的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个回答

14

您之所以收到 PHP 错误,是因为您使用了 makeInstance() 实例化控制器。如果您使用 makeInstance 获取对象管理器 (\TYPO3\CMS\Extbase\Object\ObjectManager) 并使用 $objectManager->get('TYPO3\ExtName\Controller\SampleController'),那么控制器内的依赖注入将起作用 (例如您的存储库)。

但您也可以直接使用对象管理器来获取存储库,这样您就不必调用控制器操作:

像这样:

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();
    }
}

嗨,丹尼尔,谢谢你的回答!我的调度程序任务不再抛出错误,但我仍然无法向存储库中添加任何内容。我认为Pid是问题所在,尝试使用configurationManager设置它,但没有效果。我可以在控制器中轻松地向存储库添加项目。 此外,当我将插件添加到内容元素时,还必须在“记录存储页面”中设置PID。 Pid在typoscript配置中设置。 - Daan
最有可能你需要手动调用 persistenceManager 来持久化你添加的对象。我已将它添加到我的答案中。 - Daniel
添加 persitenceManager 工作正常!现在唯一的问题是,在数据库中 pid 设置为 2(?)。 - Daan
1
在您的情况下,我建议通过 $new->setPid(1234); 来设置一个 PID。 - Daniel
谢谢您的帮助,问题已解决 :) - Daan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接