在PHP/TYPO3 Extbase中从ActionController调用CommandController
我编写了一个命令控制器,用于处理从URL导入的数据。 伪语法如下所示:在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(); } } 这很有效。 但是,当我试图从后端模块的操作控制器调用该命令时,会出现错误。 代码如下:
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。等等,什么?注入注释对性能有影响吗?对象缓存不处理这个问题吗?