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

Posted

技术标签:

【中文标题】在调度程序任务中执行存储库功能【英文标题】:Execute repository functions in scheduler task 【发布时间】:2014-02-07 11:32:04 【问题描述】:

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

无论我如何尝试从 extbase 包含我的 repo 或控制器,我都会不断收到“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】:

您收到此 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();
    

【讨论】:

您好丹尼尔,感谢您的回答!我的调度程序任务不再抛出错误,但我仍然无法向我的存储库添加任何内容。我认为 Pid 是问题所在,尝试使用无效的 configurationManager 设置它。我可以毫无问题地将项目添加到我的控制器中的存储库。此外,当我将插件添加到内容元素时,我还必须在“记录存储页面”中设置 PID。 Pid 在打字稿配置中设置.. 很可能你必须手动调用 persitenceManager 来持久化你添加的对象。我将其添加到我的答案中。 添加 persitenceManager 成功了!我现在遇到的唯一问题是数据库中的 pid 设置为 2(?)。 在你的情况下,我建议通过 $new->setPid(1234); 设置一个 pid; 感谢您的帮助,成功了 :)

以上是关于在调度程序任务中执行存储库功能的主要内容,如果未能解决你的问题,请参考以下文章

进程调度是的任务是啥

使用 Windows 任务计划程序执行存储过程

django 定时任务,轮询执行某个任务

Linux学习笔记9

计算机操作系统实时系统调度算法,死锁,存储器基础知识

Spring任务调度之Timer