我希望我的custom error pages能够使用我的主应用程序基础模板。通过基本模板使用KnpMenu
来构建菜单。部分meny仅为特权用户呈现,并且这样做我注入安全组件并执行如下检查:
if ($security->isGranted('ROLE_COURSES')) {
但是,当有404时,在防火墙组件运行之前执行的路由组件中会抛出异常。
由于安全组件尚未运行,我不完全确定实际注入菜单构建器的内容,但无论如何,当我尝试转到不存在的页面时,我会收到另一个异常在生产时执行if语句。
这里推荐的方法是什么?如果我不得不放弃渲染404的菜单,我想这没关系,但我希望我仍然能够以完整的形式呈现菜单。
答案 0 :(得分:5)
我知道这是一个老问题,但我自己面对这个问题,我通过创建一个匹配所有内容的额外路线来修复它,并且是我的路线最后匹配的东西:
pageNotFound:
pattern: /{path}
defaults: { _controller: MyContentBundle:PageNotFound:pageNotFound, path: '' }
requirements:
path: .*
行动很简单:
public function pageNotFoundAction()
{
throw new NotFoundHttpException();
}
由于您从控制器中抛出NotFound异常,因此防火墙已经运行,您现在在自定义404错误页面中有app.user
。
答案 1 :(得分:1)
互联网周围有很多这样的情况,它与在安全上下文之前加载的路由有关,因此当找不到路由时甚至没有创建用户。
在您的模板中使用它的方法是使用https://github.com/symfony/symfony-docs/issues/2078中所述的{% if app.user is not null and is_granted() %}
。
我认为可以翻译成
if (null !== $securityContext->getToken() && $securityContext->isGranted())
但我没有尝试过,所以我不确定。