从PHP / TYPO3 Extbase

时间:2017-01-04 07:58:30

标签: php typo3 extbase actioncontroller

我写了一个命令控制器来处理从URL导入的数据。 伪语法是这样的:

class ImportCommandController extends \TYPO3\CMS\Extbase\Mvc\Controller\CommandController
{
  public function importCommand($auth){
    $data = file_get_content();
  }
}
这是有效的。 但是当我尝试从我的后端模块的Action Controller调用该命令时,我得到了错误。 下面是代码: 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()时,我得到:

  

"在null"

上调用成员函数testCommand()

当我取消注释makeInstance时,我得到:

  

"在null"

上调用成员函数get()

可悲的是,这个主题在TYPO3文档中的文档相当糟糕。 有人可以帮我解决这个问题或者指出正确的方向吗?

2 个答案:

答案 0 :(得分:2)

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

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

您现在可以将此类注入CommandController和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();
    }
}

答案 1 :(得分:1)

不推荐在CommandController中使用ActionController,因为它们具有不同的环境变量。

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

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