菜单路由注册时我把 `auth_rule` 写成了 `auth_rules`,后台没报错但菜单死活不出来

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 113 浏览 0 回复

上周给社区后台写了个「内容审核」插件,功能不复杂:一个列表页、一个详情弹窗、两个批量操作按钮。按文档抄完菜单注册代码,清缓存、刷新,菜单栏里愣是没有。

先排查路由。ThinkPHP 的 `route.php` 里定义好了,直接浏览器输 URL 能访问,说明控制器和视图都没问题。那就是菜单注册的事。

翻后台的权限节点表,发现我写的节点名称是 `auth_rules/content/audit`,而系统里其他插件清一色是 `auth_rule/xxx/xxx`。少了个单复数?改过来,刷新,菜单出来了。但点进去报「无权限」。

继续扒。原来菜单注册和权限校验是两条线:菜单那套只看 `admin_menu` 表里的 `name` 字段匹不匹配,权限校验走的是 `auth_rule` 表的 `name`。我在插件的 `install.php` 里插菜单时,`name` 写的是 `content/audit`,没加 `auth_rule/` 前缀,但给管理员角色授权节点时,又老老实实写了完整路径 `auth_rule/content/audit`。

结果就是:菜单显示「有」,点进去系统校验权限「查无此节点」,直接拦在门外。两边各认各的,互不沟通。

更坑的是,有些系统框架在菜单注册时允许你省略前缀,它会自动补全;有些不会。我这套 CMS 属于「半自动」——菜单渲染时不补全,但权限校验时强制要求完整路径。文档里就一行小字提示,藏在「高级用法」章节末尾。

现在我的插件安装脚本里,菜单注册和权限授权必须同步写死同一个字符串,不敢再偷懒:

$menu = [
    'name' => 'auth_rule/content/audit',  // 必须完整
    'title' => '内容审核',
    'icon' => 'fa fa-check-square-o',
    'pid' => 0,
    'sort' => 100,
];

// 授权节点也要完全一致
$authRule = [
    'name' => 'auth_rule/content/audit',  // 和上面必须一致
    'title' => '内容审核',
    'status' => 1,
];

另外踩了个小坑:如果插件里有子菜单,pid 别写死数字。我第一台测试环境根菜单 id 是 85,上线环境是 112,因为中间插过其他插件。现在改成先查父菜单 name 再取 id,避免迁移环境时子菜单集体「找错爹」。

你们插件菜单注册时遇到过什么玄学问题?我这边已经准备把「auth_rule 前缀检查」写进代码审查清单了。

评论0
回复 · 0
还没有回复
微信客服 微信客服