插件菜单注册时权限节点漏了一个字母,后台直接给我表演"菜单隐身术"
上周给后台装了个新插件,功能测完都没问题,结果交付的时候运营同事问我:菜单呢?我登进去一看,左侧导航干干净净,仿佛这个插件从没存在过。
排查了二十分钟,最后发现是权限节点声明的时候,我把 `plugin.article.audit` 写成了 `plugin.article.audti`。就这一个字母错位,菜单注册逻辑里校验权限节点不匹配,直接整栏屏蔽,连报错日志都懒得记一笔。
后来翻了一遍自己的代码,发现这类问题我居然犯了三次,整理下给同样手滑的兄弟提个醒:
一、菜单注册和权限节点是两本账,对不上就"消失"
很多框架的插件菜单注册走的是独立流程,但渲染前会过一遍权限校验。节点声明在 `auth_rule` 或者你的权限表里,菜单配置在 `admin_menu` 或者插件的 `menu.php` 里。两边 name 必须完全一致,包括大小写、单复数、下划线位置。
我之前还遇到过 `user_log` 和 `user-log` 的坑,数据库里是下划线,菜单配置里写成短横线,结果超级管理员能看见,分配了权限的普通管理员看不见。这种"半隐身"比全消失更难查。
二、节点声明建议用常量或枚举,别手写字符串
现在我学乖了,插件里定义个 `PermissionConst` 类,所有节点全走常量:
const NODE_AUDIT = 'plugin.article.audit';
const NODE_BATCH_DELETE = 'plugin.article.batch_delete';
菜单配置和权限校验统一引用,至少能保证同错同对。要是真写错了,改一处全局生效,比满项目 grep 强。
三、调试期先把权限校验关掉,确认菜单结构正常
我现在插件开发流程固定加一步:菜单注册完,先注释掉权限中间件,裸跑一遍菜单树。确认层级、图标、跳转链接都没问题,再放开权限节点对接。这样出了问题能快速定位是菜单结构错了,还是权限节点对不上。
四、别信"保存成功"就是真的成功了
有些后台的菜单管理页面,点保存只写了菜单表,权限节点要单独去"权限管理"里加。我吃过这个亏,菜单有了,点进去 403,还以为是路由没注册,白折腾半小时。
现在我的插件安装脚本里强制双写:先插菜单,再插权限节点,最后做一次全量校验,输出不匹配的具体项。上线前跑一遍,心里踏实。
你们插件菜单注册还踩过什么奇葩坑?那种"功能正常但菜单没了"的玄学我算是领教够了。

