从命令调用操作

时间:2015-07-20 08:46:24

标签: symfony command action

我想从自定义命令执行操作。 forward方法Controller.php类提供了这个函数,但我不知道从命令文件的execute()方法访问它

3 个答案:

答案 0 :(得分:6)

使控制器成为服务会因请求堆栈而导致性能开销,因为它应返回HttpResponseRequest范围在命令中不会非常有用。

我建议您将Controller中的操作重构为单独的服务类定义,并通过将其设置为ContainerAwareCommand来从控制器和命令中的容器中获取该类。

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

答案 1 :(得分:4)

将控制器用作服务How to Define Controllers as Service

答案 2 :(得分:3)

如果您尝试从命令调用控制器操作,则需要在命令代码中设置控制器(以及随后的控制器请求)。

如果您查看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. 将您的操作所需的功能拆分为自己的类或服务。这是更好的前进方式,就像你在两个地方调用相同的代码一样,将它集中在某个地方是有意义的。