在调度程序任务中执行存储库功能
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; 感谢您的帮助,成功了 :)以上是关于在调度程序任务中执行存储库功能的主要内容,如果未能解决你的问题,请参考以下文章