如何在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
相关产品推荐
相关产品推荐

