从 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();
}
}
我编写了一个命令控制器来处理从 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();
}
}