目前我有一个调度程序任务,但我想使用我的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。
谢谢。
答案 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();
}
}