laravel-admin 中隐藏菜单的推荐方式是重写 menu 模型的 allnodes 方法:新建 adminmenu 模型继承 basemenu,过滤指定 uri 菜单项,并在 config/admin.php 中配置 'menu_model' => \app\models\adminmenu::class。

laravel-admin 默认会把所有注册的菜单项显示在左侧导航栏,但有时你只想对特定角色或场景隐藏某些菜单——比如开发阶段不希望测试人员看到“系统日志”或“数据库备份”这类功能入口。手动控制菜单显示,核心在于修改菜单数据源或拦截渲染逻辑,而不是删代码或改前端模板。
通过菜单模型重写 allNodes 方法
这是最规范、推荐的方式。laravel-admin 的菜单由 Encore\Admin\Auth\Database\Menu 类管理,它通过 allNodes() 方法返回最终展示的菜单树。你可以自定义一个菜单模型,继承原类并覆盖该方法:
- 新建模型
app/Models/AdminMenu.php,内容如下:
namespace App\Models;
use Encore\Admin\Auth\Database\Menu as BaseMenu;
class AdminMenu extends BaseMenu
{
public static function allNodes()
{
$nodes = parent::allNodes();
// 示例:隐藏 uri 为 'logs' 和 'backup' 的菜单项
return $nodes->filter(function ($node) {
return !in_array($node->uri, ['logs', 'backup']);
})->values();
}
}
- 在
config/admin.php中指定使用该模型:
'menu_model' => \App\Models\AdminMenu::class,
重启服务后,对应菜单将不再出现在左侧导航中,且不影响权限校验和路由访问。
在菜单配置中动态设置 visible 字段
如果你是通过数据库管理菜单(即使用默认的 admin_menu 表),可直接给菜单记录添加 visible 字段控制显隐:
- 先为菜单表增加字段:
php artisan make:migration add_visible_to_admin_menu --table=admin_menu - 在迁移文件中添加:
$table->boolean('visible')->default(true); - 执行迁移:
php artisan migrate - 修改
app/Admin/Controllers/MenuController.php(如果已生成)或直接在后台菜单管理页,把不想显示的菜单的visible设为0 - 再重写
allNodes()方法(同上),过滤掉visible = 0的节点
用中间件或权限规则间接隐藏
严格来说这不是“隐藏菜单”,而是让无权限用户看不到——效果一致,且更安全:
- 进入后台「权限管理 → 角色」,编辑目标角色(如“普通运营”)
- 取消勾选你不希望该角色看到的菜单对应权限(如“日志管理”)
- 确保菜单项的
permission字段与权限名匹配(例如菜单 uri 为logs,对应权限名应设为logs.view) - 这样用户登录后,即使菜单数据存在,也会因权限不足被自动过滤
不建议的硬编码方式
有人尝试直接修改 vendor/encore/laravel-admin/src/Auth/Database/Menu.php,但这会导致升级时丢失改动,且违反 Composer 包管理原则。同样,也不推荐在 Blade 模板里用 @if 判断 uri 后 display: none —— 页面仍加载了 DOM,存在信息泄露风险。











