当我在控制器中执行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