Я написал командный контроллер, который обрабатывает импорт данных из URL.
псевдосинтаксис выглядит так:
class ImportCommandController extends \TYPO3\CMS\Extbase\Mvc\Controller\CommandController
{
public function importCommand($auth){
$data = file_get_content();
}
}
это работает.
Но когда я пытаюсь вызвать эту команду из контроллера действий моего внутреннего модуля, я получаю ошибки.
Вот код:
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();
}
}
Когда я звоню importAction()
вот так я получаю:
«Вызов функции-члена testCommand () в null»
Когда я раскомментирую makeInstance
, Я получил:
«Вызов функции-члена get () в null»
К сожалению, эта тема довольно плохо документирована в Документах TYPO3.
Может ли кто-нибудь помочь мне в этом или указать мне правильное направление?
Я хотел бы немного изменить ответ, который уже дал Рене, и добавить несколько примеров кода. Я также рекомендую поместить вашу логику импорта в выделенный класс, например 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();
}
}
Использование CommandController
в ActionController
не рекомендуется, потому что они имеют разные переменные окружения.
Если вы хотите использовать какой-то код на большей позиции, рекомендуется использовать классы Utility.
Так что создайте класс в my_ext/Classes/Utility/
каталог вызвать класс что-то вроде ImportUtility
и попытайтесь закодировать ваш импорт независимо от какого-либо контроллера.