2015-07-20 55 views

回答

5

使得控制器服務會導致性能的execute()方法訪問它因請求堆棧而開銷,因爲它應該返回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

這是我體驗過的方式,但它需要在命令文件的「執行」功能中使用方法'forward'。看來,這種方法'前進'只適用於控制器 –