多级菜单嵌套实战:插件中如何实现无限层级动态菜单

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 27 浏览 7 回复

在开发后台管理插件时经常遇到多级菜单需求,传统的静态声明方式会让代码变得臃肿。今天分享一个基于树形结构的动态注册方案,核心逻辑如下:

首先在插件入口文件定义菜单结构树:


$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组件可以实现动态菜单渲染。你们在项目中如何处理复杂菜单结构?欢迎交流其他实现方案。

评论7
回复 · 7
CoolKid🌸
CoolKid🌸 初级璃梦花海 · #7 ·
支持了~
张军
张军 初级 · #6 ·
同求,期待更新
安然
安然 初级时梦乐园 · #5 ·
学到了,顶一下
WadeWave
WadeWave 初级 · #4 ·
感谢分享!
KateStar
KateStar 初级 · #3 ·
学到了,顶一下
IvySky
IvySky 初级 · #2 ·
同求,期待更新
AmberYang
AmberYang 初级净世白羽 · #1 ·
同求,期待更新
微信客服 微信客服 QQ官方交流群 QQ官方交流群