You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FilamentPHP中条件性显示或隐藏Authentication菜单组

隐藏FilamentPHP filament-authentication扩展的Authentication菜单组

以下是几种实现根据条件隐藏整个Authentication菜单组及下属菜单项的方法:

方法一:利用扩展包配置文件控制

首先发布扩展包的配置文件(如果还没发布):

php artisan vendor:publish --tag=filament-authentication-config

打开生成的config/filament-authentication.php文件,根据你的需求添加条件判断:

  • 如果扩展包支持全局启用菜单组的配置,直接给菜单组的启用状态绑定条件:
'menu' => [
    'enabled' => auth()->user()?->isSuperAdmin(), // 示例:仅超级管理员可见
    // 保留原有其他配置项
],
  • 若没有全局开关,可逐个给子菜单项设置启用条件:
'menu' => [
    'items' => [
        'role' => [
            'enabled' => auth()->user()?->can('manage_roles'),
            // 原有配置...
        ],
        'permission' => [
            'enabled' => auth()->user()?->can('manage_permissions'),
            // 原有配置...
        ],
        'user' => [
            'enabled' => auth()->user()?->can('manage_users'),
            // 原有配置...
        ],
    ],
],

方法二:通过Filament全局菜单钩子修改

如果扩展包配置不满足需求,可使用Filament的菜单钩子在全局层面修改导航结构。在App\Providers\AppServiceProvider的boot方法中添加以下代码:

use Filament\Facades\Filament;
use Filament\Navigation\NavigationGroup;

Filament::serving(function () {
    // 替换成你的条件判断逻辑
    if (!auth()->user()?->isSuperAdmin()) {
        Filament::navigation(function ($navigation) {
            // 过滤掉名为Authentication的菜单组
            $navigation->groups = collect($navigation->groups)->reject(function (NavigationGroup $group) {
                return $group->getName() === 'Authentication';
            })->toArray();
        });
    }
});

如果需要更精细的控制(比如先移除组内所有菜单项,再清空组),可以用这段代码:

use Filament\Facades\Filament;
use Filament\Navigation\NavigationGroup;
use Filament\Navigation\NavigationItem;

Filament::serving(function () {
    if (!auth()->user()?->isSuperAdmin()) {
        Filament::navigation(function ($navigation) {
            foreach ($navigation->groups as $group) {
                if ($group->getName() === 'Authentication') {
                    // 移除组内指定菜单项
                    $group->items = collect($group->items)->reject(function (NavigationItem $item) {
                        return in_array($item->getName(), ['Role', 'Permission', 'User']);
                    })->toArray();
                    // 若组内无剩余菜单项,直接移除整个组
                    if (empty($group->items)) {
                        $navigation->groups = collect($navigation->groups)->reject(fn($g) => $g->getName() === 'Authentication')->toArray();
                    }
                }
            }
        });
    }
});

方法三:自定义菜单注册逻辑(进阶)

如果前两种方法都无法实现需求,可以创建自定义的ServiceProvider来覆盖扩展包的菜单注册逻辑,或者重写扩展包的相关菜单类。这种方法复杂度较高,仅建议在必要时使用。

内容的提问来源于stack exchange,提问作者Abhishek Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:42:43