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

时间:2013-02-28 09:53:31

标签: symfony httpresponse forwarding

当我在控制器中执行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();时,hierarchie是正常的。

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

3 个答案:

答案 0 :(得分:1)

原因是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) ...

答案 1 :(得分:0)

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

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

此外,由于转发只是核心Symfony2功能的快捷方式,this可能有所帮助。

答案 2 :(得分:0)

在我的案例中,以下代码有所帮助:

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

“主题”是TopicController,“close”是closeAction