从 PHP/TYPO3 Extbase 中的 ActionController 调用 CommandController

Calling a CommandController from ActionController in PHP/TYPO3 Extbase

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

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

这行得通。 但是,当我尝试从后端模块的动作控制器调用该命令时,出现错误。 继承人的代码: 动作控制器:

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() 时,我得到:

"Call to a member function testCommand() on null"

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

"Call to a member function get() on null"

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

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

如果你想在更多位置使用一些代码,建议使用 Utility classes.

所以在 my_ext/Classes/Utility/ 目录中创建一个 Class 调用 class 类似 ImportUtility 的东西,并尝试独立于某些控制器对您的导入进行编码。

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

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

您现在可以将此 class 作为您的 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();
    }
}