【问题标题】:Symfony 2 - Call controller from another controllerSymfony 2 - 从另一个控制器调用控制器
【发布时间】:2014-10-26 13:27:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: php symfony controller


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      use AppBundle\Controller\MySourceDataController;
      

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

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

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

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

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

      【讨论】:

      • 干净吗?这对我来说既自然又怪诞。我是一个 symfony 初学者,我不知道我是否应该/可以在生产中使用它。
      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多