【问题标题】: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。

谢谢。

【问题讨论】:

    标签: php task typo3 scheduler extbase


    【解决方案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;
    • 感谢您的帮助,成功了 :)
    猜你喜欢
    • 2014-11-26
    • 2021-07-20
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2021-12-18
    • 2016-03-19
    相关资源
    最近更新 更多