Symfony2为什么转发嵌套请求对象



当我在控制器中执行forward()时,我丢失了我的route和route_parameters。

当我有ParentAction时,它会转发给ChildAction。在Childaction中,我做return $this->render('myTemplate.html.twig', array());,然后请求属性得到嵌套!

所以当模板被渲染,而不是$request['attributes']['_route_parameters']我得到$request['attributes']['request']['attributes']['_route_parameters']

虽然在ChildAction中,当我执行$this->getRequest();时,层次结构是正常的。

这是一个bug,还是我做错了什么?

原因是symfony不假设你有相同的路由参数。因此,当您转发时,您需要重新提供新路由所需的路由参数,即使它们是相同的。

(顺便说一下,您还必须为新路由提供任何查询参数)

public function indexAction($param)
{
    return $this->forward(
        'AppBundle\Controller\DefaultController::otherAction',
        array("someOtherParam" => $param),
        $request->query->all() // Causes query string params to be copied
    );
}
// This route has a different parameter.
public function otherAction($someOtherParam) ...

一个可能的解决方案是在转发时将您的请求作为第二个参数传递。

$response = $this->forward('MyBundle:MyController:myAction', array('request' => $request));

另外,forward只是Symfony2核心功能的快捷方式,这可能会有所帮助。

下面的代码对我的情况有帮助:

$subRequest = $this->container->get('request')->duplicate(
    array(), 
    null, 
    array('topicId' => $topicId,'_controller' => 'SomeBundle:Topic:close'));
return $this->container->get('http_kernel')
    ->handle($subRequest, HttpKernelInterface::SUB_REQUEST);

"Topic"为TopicController, "close"为closeAction

相关内容

  • 没有找到相关文章

最新更新