2017-01-04 2 views
2

Я написал командный контроллер, который обрабатывает импорт данных из URL-адреса. псевдо-синтаксис выглядит так:Вызов CommandController из ActionController в PHP/TYPO3 Extbase

class ImportCommandController extends \TYPO3\CMS\Extbase\Mvc\Controller\CommandController 
{ 
    public function importCommand($auth){ 
    $data = file_get_content(); 
    } 
} 

это работает. Но когда я пытаюсь вызвать эту команду из Action Controller моего внутреннего модуля, я получаю ошибки. Heres код: 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() на нуль"

Когда Я раскомментирую makeInstance, я получаю:

«Вызовите функцию-член get() по нулевому значению«

К сожалению, эта тема плохо документирована в документах TYPO3. Может ли кто-нибудь помочь мне в этом или указать мне в правильном направлении?

ответ

1

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

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

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

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(); 
    } 
} 
+0

В будущем injectFunctions используют вместо аннотаций @injects – jokumer

+0

Вы правы. Инъекционные методы действительно лучше, чем анализ аннотаций. Но они также раздувают код примера, поэтому я использовал @inject здесь. – Daniel

+0

Подождите, что? Вводная аннотация влияет на производительность? Не заботится об этом кеш объекта? – j4k3

 Смежные вопросы

  • Нет связанных вопросов^_^