2015-07-20 3 views

ответ

3

Использование контроллера в качестве службы How to Define Controllers as Service

+0

Как раз с этим решением, которое мне нужно использовать вперед. –

5

Making контроллер услуга приведет к производительности из-за стека запросов, так как тогда он должен вернуть HttpResponse. Область Request не будет очень полезна в команде.

Я бы посоветовал вам реорганизовать действие с контроллера на отдельное определение класса обслуживания и получить этот класс из контейнера как в контроллере, так и в команде, сделав его ContainerAwareCommand.

http://symfony.com/doc/current/cookbook/console/console_command.html#getting-services-from-the-service-container

1

Если вы пытаетесь вызвать действие контроллера из команды, то вам нужно настроить контроллер (и впоследствии запрос на контроллер) в командной коде.

Если вы посмотрите в Symfony\Bundle\FrameworkBundle\Controller, то вы увидите, что метод forward() дублирует текущий Request объект, а затем отправляет его через HttpKernel. Поскольку команды не используют HttpKernel, такой переадресация не будет работать.

В зависимости от того, что делает ваши действия, вы можете просто быть в состоянии сделать:

$controller = new Your\Controller(); 
$controller->yourAction(); 

Если действие требует запрос затем:

$request = Symfony\Component\HttpFoundation\Request::createFromGlobals(); 
$controller = new Your\Controller(); 
$controller->setContainer($this->getContainer()); // from the ContainerAwareCommand interface 
$controller->yourAction($request); 

звуками него это не сделав то, что вы хотите, так что есть несколько путей вперед:

  1. Включите ваш контроллер в сервис, это описано в the cookbook и будет означать, что ваш контроллер и действие могут быть вызваны непосредственно из контейнера, который ваша команда (возможно) настроила. Это управляет зависимостями, которые могут иметь ваш контроллер и действия.
  2. Разделите функциональность, которая вам нужна от вашего действия, в свой класс или службу. Это лучший путь вперед, как если бы вы вызывали один и тот же бит кода в двух местах, имеет смысл централизовать его где-то.
+0

Это способ, которым я испытал, но требует использования метода «вперед» в функции «выполнить» командного файла. Похоже, что этот метод «вперед» работает только в контроллерах –

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