FilamentPHP v3+Laravel11:AdminPanelProvider无法获取Auth()->id()
解决FilamentPHP v3 + Laravel 11中AdminPanelProvider静态方法无法获取当前用户ID的问题
问题原因
AdminPanelProvider的panel()方法是在应用启动阶段执行的,此时HTTP请求还未经过Auth中间件处理,直接调用Auth()->id()或者在静态方法中同步执行用户ID获取逻辑,都无法拿到登录用户的ID。而brandName方法通常是在页面渲染阶段(已进入请求周期、Auth验证完成)才会被调用,所以能正常获取用户信息。
解决方案
方案1:延迟用户ID获取到请求周期内(推荐)
Filament的导航项支持返回闭包,让Filament在请求处理阶段再执行闭包内的逻辑,此时Auth已完成验证,能正常获取用户ID。
class AdminPanelProvider extends PanelProvider { public function panel(Panel $panel): Panel { return $panel // 其他面板配置... ->navigationItems([ static::NavigationReportList(), ]); } public static function NavigationReportList(): Closure { return function () { $userId = Auth::id(); return NavigationItem::make('报表列表') ->url(route('admin.reports', ['user_id' => $userId])) ->icon('heroicon-o-document-text'); }; } public function brandName(): string { $userId = Auth::id(); return "品牌名称 - 用户ID: {$userId}"; } }
方案2:通过Filament认证上下文获取用户
使用Filament内置的Filament::auth()方法获取当前平台的认证用户,同样用闭包延迟执行:
public static function NavigationReportList(): Closure { return function () { $user = Filament::auth()->user(); if (!$user) { // 未登录时可返回null隐藏导航项 return null; } return NavigationItem::make('报表列表') ->url(route('admin.reports', ['user_id' => $user->id])) ->icon('heroicon-o-document-text'); }; }
方案3:非推荐场景的应急处理
如果必须在面板注册阶段尝试获取用户ID(不推荐,依赖请求上下文),可以通过request()->user()尝试获取,但仅在请求已进入Auth中间件栈后有效:
public static function NavigationReportList() { $userId = request()->user()?->id; if (!$userId) { return null; } return NavigationItem::make('报表列表') ->url(route('admin.reports', ['user_id' => $userId])) ->icon('heroicon-o-document-text'); }
关键注意点
所有依赖当前登录用户的导航配置,都需要通过闭包延迟执行,确保逻辑在请求周期内(Auth验证完成后)运行,这是Filament动态导航的标准用法。
内容的提问来源于stack exchange,提问作者Ala'a
相关产品推荐
相关产品推荐

