Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP/TYPO3 Extbase中从ActionController调用CommandController_Php_Typo3_Extbase_Actioncontroller - Fatal编程技术网

在PHP/TYPO3 Extbase中从ActionController调用CommandController

在PHP/TYPO3 Extbase中从ActionController调用CommandController,php,typo3,extbase,actioncontroller,Php,Typo3,Extbase,Actioncontroller,我编写了一个命令控制器,用于处理从URL导入的数据。 伪语法如下所示: class ImportCommandController extends \TYPO3\CMS\Extbase\Mvc\Controller\CommandController { public function importCommand($auth){ $data = file_get_content(); } } 这很有效。 但是,当我试图从后端模块的操作控制器调用该命令时,会出现错误。 代码如下:

我编写了一个命令控制器,用于处理从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();
    }
}
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();
    }
}
当我像这样调用
importAction()
时,我得到:

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

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

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

遗憾的是,这个主题在TYPO3文档中记录得相当糟糕。
有人能帮我一下吗?或者给我指出正确的方向吗?

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

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


因此,在
my_ext/Classes/Utility/
目录中创建一个类,将该类称为
importability
,并尝试独立于某个控制器对导入进行编码。

我想稍微修改Rene已经给出的答案,并添加一些代码示例。我还建议将导入逻辑放入专用类中,例如,
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\Command\ImportCommandController importCommandCtrl
     * @inject
     */
    protected $importCommandCtrl;

    public function importAction()//($url,$usr,$pass)
    {
        //$this->importCommandCtrl = GeneralUtility::makeInstance('Vendor\MyExt\Command\ImportCommandController');
        $this->importCommandCtrl->testCommand();
    }
}
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而不是annotation@injectsYou是正确的。注入方法的性能确实优于注释的解析。但它们也会膨胀示例代码,这就是为什么我在这里使用@inject。等等,什么?注入注释对性能有影响吗?对象缓存不处理这个问题吗?