2017-01-04 33 views
2

我编写了一个处理从URL导入数据的命令控制器。 伪语法是这样的:在PHP/TYPO3中从ActionController调用CommandController Extbase

class ImportCommandController extends \TYPO3\CMS\Extbase\Mvc\Controller\CommandController 
{ 
    public function importCommand($auth){ 
    $data = file_get_content(); 
    } 
} 

这个工程。 但是,当我尝试从我的后端模块的操作控制器调用该命令时,我收到错误。 继承人的代码: 的ActionController:

class ImportController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController 
{ 
    /** 
    * @var \Vendor\MyExt\Command\ImportCommandController importCommandCtrl 
    * @inject 
    */ 
    protected $importCommandCtrl; 

    public function importAction()//($url,$usr,$pass) 
    { 
     //$this->importCommandCtrl = GeneralUtility::makeInstance('Vendor\MyExt\Command\ImportCommandController'); 
     $this->importCommandCtrl->testCommand(); 
    } 
} 

当我打电话importAction()这样,我得到:

“调用一个成员函数testCommand()对空”

当我取消了makeInstance,我得到:

“调用成员函数get()null”

不幸的是,这个主题在TYPO3 Docs中文档比较差。 有人可以帮助我,或指向正确的方向吗?

回答

1

不建议在ActionController中使用CommandController,因为它们具有不同的开放变量。

如果您想在更多位置上使用某些代码,建议您使用Utility类。

因此,在my_ext/Classes/Utility/目录中创建一个类,调用类似ImportUtility的类,并尝试从某个控制器中独立编码导入。

2

我想稍微改变René给出的答案并添加一些代码示例。我还建议您将导入逻辑放入专门的课程中,例如ImportService

namespace Vendor\MyExt\Service; 
use TYPO3\CMS\Core\SingletonInterface; 
class ImportService implements SingletonInterface 
{ 
    public function importData() 
    { 
     // import logic goes here 
    } 
} 

您现在可以注入这个类作为您的命令控制器的依赖和你的ActionController:

class ImportController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController 
{ 
    /** 
    * @var \Vendor\MyExt\Service\ImportService 
    * @inject 
    */ 
    protected $importService; 

    public function importAction() 
    { 
     $this->importService->importData(); 
    } 
} 

class ImportCommandController extends \TYPO3\CMS\Extbase\Mvc\Controller\CommandControlle 
{ 
    /** 
    * @var \Vendor\MyExt\Service\ImportService 
    * @inject 
    */ 
    protected $importService; 

    public function importCommand() 
    { 
     $this->importService->importData(); 
    } 
} 
+0

在未来使用injectFunctions代替注释@injects – jokumer

+0

你是对的。注入方法确实比解析注释更好。但他们也膨胀了示例代码,这就是为什么我在这里使用@inject。 – Daniel

+0

等等,什么?注入注释对性能有影响?对象缓存没有照顾到吗? – j4k3