【问题标题】:Calling a CommandController from ActionController in PHP/TYPO3 Extbase在 PHP/TYPO3 Extbase 中从 ActionController 调用 CommandController
【发布时间】:2017-01-04 07:58:29
【问题描述】:

我编写了一个命令控制器来处理从 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() 时,我得到:

“在 null 时调用成员函数 testCommand()”

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

"在 null 上调用成员函数 get()"

遗憾的是,该主题在 TYPO3 文档中的记录相当差。 有人可以帮助我或指出正确的方向吗?

【问题讨论】:

    标签: php typo3 extbase actioncontroller


    【解决方案1】:

    我想稍微修改一下 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();
        }
    }
    

    【讨论】:

    • 以后用injectFunctions代替注解@injects
    • 你是对的。注入方法确实比注释的解析执行得更好。但是他们也膨胀了示例代码,这就是我在这里使用@inject 的原因。
    • 等等,什么?注入注解对性能有影响吗?对象缓存不处理这个吗?
    【解决方案2】:

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

    如果您想在更多位置使用一些代码,建议使用实用程序类。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2023-03-03
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多