多级菜单嵌套实战:插件中如何实现无限层级动态菜单
在开发后台管理插件时经常遇到多级菜单需求,传统的静态声明方式会让代码变得臃肿。今天分享一个基于树形结构的动态注册方案,核心逻辑如下:
首先在插件入口文件定义菜单结构树:
$menuTree = [
'plugin_name' => [
'title' => '主菜单',
'icon' => 'fa-cube',
'children' => [
'module1' => [
'title' => '一级菜单',
'permission' => 'module1_view',
'children' => [
'sub1' => [
'title' => '二级菜单',
'url' => '/plugin/module1/sub1',
'permission' => 'sub1_manage'
]
]
]
]
]
];
关键点在于递归注册函数:
function registerMenuNodes($nodes, $parent = '') {
foreach ($nodes as $key => $item) {
$fullKey = $parent ? $parent.'/'.$key : $key;
if (isset($item['children'])) {
registerMenuNodes($item['children'], $fullKey);
unset($item['children']);
}
Hook::add('menu_init', function() use ($fullKey, $item) {
Menu::add($fullKey, $item);
});
}
}
踩坑提醒:
1. 权限节点key必须全局唯一,建议采用"插件名/模块名"的命名规则 2. 路由参数需要做URL编码处理,特别是包含中文的菜单项 3. 菜单缓存问题:修改权限后需要手动清除缓存才能生效这个方案已在实际项目中验证,支持任意层级扩展,配合前端Vue组件可以实现动态菜单渲染。你们在项目中如何处理复杂菜单结构?欢迎交流其他实现方案。
最新打赏


QQ官方交流群