Symfony 2 - 从另一个控制器调用控制器

时间:2014-10-26 13:27:12

标签: php symfony controller

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

方法this-> forward需要一个Response对象,我不知道如何使用它。

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;
}

我看到我可以使用服务,但我想知道它是否是最佳解决方案,或者它们是另一种解决方案。

2 个答案:

答案 0 :(得分:6)

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

  1. 字符串格式的控制器操作的逻辑名称,即' AcmeHelloBundle:Hello:fancy'
  2. 以数组格式作为请求变量传递的参数,即数组( '名称' => $名称, '颜色' => '绿色&#39 ;, )
  3. 可以使用请求访问功能在控制器中访问这些参数。

答案 1 :(得分:2)

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

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

use AppBundle\Controller\MySourceDataController;

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

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

如果需要传递Request对象,可以这样做:

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

这将返回带有server参数的Request。我还定义了一个$ 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 );
}

瞧。从任何其他控制器访问任何控制器并绕过源控制器的安全符号。 :)