Вызов CommandController из ActionController в PHP / TYPO3 Extbase

Я написал командный контроллер, который обрабатывает импорт данных из 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.
Может ли кто-нибудь помочь мне в этом или указать мне правильное направление?

2

Решение

Я хотел бы немного изменить ответ, который уже дал Рене, и добавить несколько примеров кода. Я также рекомендую поместить вашу логику импорта в выделенный класс, например 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();
}
}
2

Другие решения

Использование CommandController в ActionController не рекомендуется, потому что они имеют разные переменные окружения.

Если вы хотите использовать какой-то код на большей позиции, рекомендуется использовать классы Utility.

Так что создайте класс в my_ext/Classes/Utility/ каталог вызвать класс что-то вроде ImportUtility и попытайтесь закодировать ваш импорт независимо от какого-либо контроллера.

1

По вопросам рекламы [email protected]