Sonata 4.13+Symfony5.4自定义404错误页面异常排查
Sonata Admin 4.13 + Symfony 5.4 自定义404页面侧边栏空、不显示用户名的修复方案
问题根源
Symfony的错误页面(包括/_error/404)是在独立请求上下文里渲染的,默认不会加载Sonata Admin的核心服务(比如AdminPool),也不会自动初始化侧边栏菜单所需的Admin上下文。另外,错误页面默认可能没正确获取已登录用户的安全令牌,导致用户名显示不出来。
修复步骤
1. 修改404模板,手动加载侧边栏和用户信息
更新/templates/bundles/TwigBundle/Exception/error404.html.twig内容:
{% extends '@SonataAdmin/standard_layout.html.twig' %} {% block title %}404 - 页面不存在{% endblock %} {% block content %} <div class="alert alert-danger"> <h1>404 页面未找到</h1> <p>您访问的页面不存在或已被移除</p> </div> {% endblock %} {% block side_bar %} {% if app.user %} {# 手动调用Sonata侧边栏渲染函数,传入AdminPool服务 #} {{ sonata_admin_side_bar(sonata_admin.adminpool) }} {% else %} <div class="sonata-sidebar"> <p>请登录以访问完整管理功能</p> </div> {% endif %} {% endblock %} {% block user_block %} {% if app.user %} <div class="sonata-user-block"> <span>欢迎, {{ app.user.username }}</span> <a href="{{ path('sonata_admin_security_logout') }}" class="btn btn-sm btn-default">退出</a> </div> {% endif %} {% endblock %}
2. 配置Sonata Admin使用自定义错误模板
在config/packages/sonata_admin.yaml里添加错误模板配置:
sonata_admin: # 保留原有配置... templates: error: '@Twig/Exception/error404.html.twig'
3. 确保错误页面能获取用户会话
在config/packages/security.yaml中,允许_error路由通过防火墙,保留用户会话:
security: # 保留原有配置... access_control: # 允许错误页面匿名访问,同时保留已登录用户的会话 - { path: ^/_error, roles: IS_AUTHENTICATED_ANONYMOUSLY } # 其他原有访问控制规则...
4. 清除缓存(必做)
执行缓存清除命令,让配置和模板生效:
# 开发环境 php bin/console cache:clear # 生产环境 php bin/console cache:clear --env=prod
补充说明
- 访问
/_error/404时,Symfony是模拟错误场景,侧边栏的菜单可能和正常Admin页面一致,但如果某些Admin服务依赖特定请求参数,可能会有细微差异。 - 如果
app.user仍无法获取,可尝试直接从安全令牌获取:
{% if app.security.token_storage.token is not null and app.security.token_storage.token.user is not null %} <span>欢迎, {{ app.security.token_storage.token.user.username }}</span> {% endif %}
内容的提问来源于stack exchange,提问作者Loraga
相关产品推荐
相关产品推荐

