插件菜单"隐身"事件:路由别名与权限节点命名空间对不上号的那次排查
上周给后台装了个新插件,菜单配好了、路由也写了,前台页面能正常访问,但后台左侧愣是不显示入口。F12 看了 DOM,节点压根没渲染出来,不是 CSS 隐藏,是真的没输出。
先怀疑是缓存。清了三遍,换浏览器,甚至把 `runtime/admin` 整个删了重建,菜单还是不出来。这时候才意识到问题可能在权限校验层——我的账号是超管,按说不受普通权限限制,但某些系统里超管也要过一遍节点存在性检测,节点对不上就直接跳过渲染。
翻插件的 `menu.php` 配置,看到这段:
'route' => 'plugin/invoice/index'
再去看权限节点声明:
'name' => 'plugin/invoice/index'
表面看一模一样对吧?但路由定义里我为了省事儿用了别名:
Route::get('invoice', 'plugin/invoice/index')->name('plugin.invoice.index');
注意这个 `name` 里的点是 `.`,而菜单配置和权限节点里写的是 `/`。系统在生成权限树的时候,拿的是路由别名做 key 匹配,菜单注册时传的却是斜杠路径。两个字符串在数据库里各躺各的,校验函数一对比,"不存在,跳过",菜单就这么被静默丢弃了。
更坑的是,这种错不会抛异常。没有日志,没有报错,就是单纯的不显示。你要不是逐行跟一遍菜单渲染流程,根本意识不到是命名格式的问题。
现在我的插件配置里强制约定了一套命名规则:路由别名、权限节点、菜单标识三者必须走同一套分隔符规范,要么全点要么全斜杠,混用就是给自己埋雷。另外给菜单注册加了个调试开关,开发环境下如果节点匹配失败直接打 warning 到浏览器控制台,至少不用盲猜。
你们插件菜单遇到过这种"一切正常但就是看不见"的情况吗?最后查出来是什么鬼原因?

