我想将管理员/admin
和成员重定向到/member
用户被识别但进入主页 ( /
) 时。
控制器如下所示:
public function indexAction()
{
if ($this->get('security.context')->isGranted('ROLE_ADMIN'))
{
return new RedirectResponse($this->generateUrl('app_admin_homepage'));
}
else if ($this->get('security.context')->isGranted('ROLE_USER'))
{
return new RedirectResponse($this->generateUrl('app_member_homepage'));
}
return $this->forward('AppHomeBundle:Default:home');
}
如果我的用户已登录,它运行良好,没问题。但如果不是,我的 i18n 开关让我得到一个很好的例外:
合并过滤器仅适用于“AppHomeBundle:Default:home.html.twig”中的数组或哈希。
崩溃的行:
{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'fr'})) }}
如果我查看app.request.get('_route_params')
,它是空的,以及app.request.get('_route')
。
当然,我可以通过替换来解决我的问题return $this->forward('AppHomeBundle:Default:home');
,return $this->homeAction();
但我不明白这一点。
内部请求是否覆盖了用户请求?
注意:我正在使用Symfony version 2.2.1 - app/dev/debug
编辑
查看 Symfony 的源代码,当使用 时forward
,会创建一个子请求,我们不再处于同一范围内。
/**
* Forwards the request to another controller.
*
* @param string $controller The controller name (a string like BlogBundle:Post:index)
* @param array $path An array of path parameters
* @param array $query An array of query parameters
*
* @return Response A Response instance
*/
public function forward($controller, array $path = array(), array $query = array())
{
$path['_controller'] = $controller;
$subRequest = $this->container->get('request')->duplicate($query, null, $path);
return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}
通过查看Symfony2 的范围文档,他们讲述了为什么 request 本身就是一个范围以及如何处理它。但是他们没有说明为什么在转发时会创建子请求。
更多的谷歌搜索让我了解了事件侦听器,在那里我了解到可以处理子请求(详细信息)。好的,对于子请求类型,但这仍然不能解释为什么刚刚删除了用户请求。
我的问题变成:
为什么用户请求在转发时被删除而不是复制?