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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:22:33