Symfony 4.4项目如何识别当前页面对应动态菜单项并添加激活类
方案1:原生实现(无需引入新组件)
这是成本最低的适配方案,不需要修改现有架构:
- 优化菜单参数存储结构
把你菜单表的routeParameters字段改成JSON类型,存储完整的路由参数键值对,而不是仅存参数值。比如对应slug参数的路由存{"slug": "product-slug"},对应id参数的路由存{"id": 123},渲染时直接传入path函数即可,适配所有参数类型的路由:
{% set itemHref = '#' %} {% if child3.route is not null %} {% set params = child3.routeParameters ? child3.routeParameters|json_decode : {} %} {% set itemHref = path(child3.route, params) %} {% endif %}
- 通用激活状态判断
直接对比当前请求路径和菜单项生成的链接即可,完全不用关心路由参数的差异:
<li class="{% if child3.getMenuItems()|length > 0 %}nav-dropdown{% endif %} {% if itemHref == app.request.pathInfo %}active{% endif %}">
- 父级菜单自动展开
可以写一个简单的Twig扩展,或者在基础控制器里提前获取当前激活菜单项的所有父级ID,存为全局Twig变量activeMenuParentIds,渲染父菜单时判断id是否在该数组内,添加对应的展开类即可。
方案2:使用KnpMenu实现
KnpMenu完全支持你的需求,自带成熟的菜单匹配逻辑,适合后续菜单逻辑迭代的场景:
你只需要写一个菜单构建器,从数据库读取你的菜单配置生成KnpMenu节点树,组件会自动识别当前页面对应的菜单项,给当前节点加current类,所有父节点加current-ancestor类,无需自己写匹配逻辑,也支持权限校验、自定义渲染模板等需求,和你现有的动态菜单场景适配度很高。
内容的提问来源于stack exchange,提问作者Petoux
相关产品推荐
相关产品推荐

