1

当我在控制器中执行 forward() 时,我丢失了路由和 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();层次结构时是正常的。

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

4

3 回答 3

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) ...
于 2015-03-16T01:39:08.343 回答
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,“关闭”是 closeAction

于 2013-09-13T11:21:30.287 回答
0

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

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

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

于 2013-02-28T09:56:37.550 回答