Вызов 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();
    }
}

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

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

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

Другие вопросы по тегам