Symfony 2-从另一个控制器呼叫控制器


Symfony 2 - Call controller from another controller

我想在我的控制器中使用另一个捆绑包中的控制器方法。

这个->转发的方法需要一个响应对象,我不知道如何使用它。

public function indexAction($name)
{
$response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
    'name'  => $name,
    'color' => 'green',
));
// ... further modify the response or return it directly
return $response;
}

我看到我可以使用服务,但我想知道这是最好的解决方案还是另一种解决方案。

$this->forward按以下顺序接受参数:

  1. 字符串格式的控制器操作的逻辑名称,即"AcmeHelloBundle:Hello:fancy"
  2. 以数组格式(即数组)作为请求变量传递的参数('name'=>$name,'color'=>'green',)

可以使用请求访问功能在控制器中访问这些参数。

有时您希望完全绕过安全性,在另一个控制器中运行命令,而不管用户的权限级别如何。幸运的是,你可以很容易地做到这一点。

首先,在要使用数据的控制器顶部为您的控制器运行use命令:

use AppBundle'Controller'MySourceDataController;

然后从目的地控制器中调用该函数:

$response = MySourceDataController::getTheData( $option1, $option2 );

如果你需要传递一个请求对象,你可以这样做:

$response = MySourceDataController::getTheData( new Request( array(
    'server' => 'USAServer1',
) ), $option2 );

这将返回一个带有服务器设置参数的请求。我还定义了$option2,这将是一个经常在URL中定义的变量,例如:

* @Route("/mydata/{server}/", name="api-source-data")
* @param Request $request
* @param         $server

最后,如果您在该控制器中传递JSON并希望将其转换回对象,则可以在$response:上运行以下代码

if ( 0 === strpos( $response->headers->get( 'Content-Type' ), 'application/json' ) ) {
    $response = json_decode( $response->getContent(), true );
}

沃伊拉。从任何其他控制器访问任何控制器,并绕过源控制器的安全标记。:)