Laravel 11中如何在自定义中间件中获取Auth::id()?
Laravel 11中间件中获取Auth::id()返回NULL的解决方法
问题原因
Laravel 11调整了中间件的默认执行顺序,控制器构造函数中注册的自定义中间件会优先于会话(StartSession)和认证(Authenticate)中间件执行。此时用户会话尚未初始化,因此Auth::id()会返回null,而旧版Laravel的执行顺序不同,所以之前能正常获取用户ID。
解决办法
1. 控制中间件执行顺序
在控制器构造函数中,先注册会话/认证相关中间件,再注册你的自定义中间件,确保依赖的组件先完成初始化:
public function __construct() { // 若需要强制用户登录,先执行auth中间件 $this->middleware('auth')->middleware('NewMiddleware'); // 若无需强制登录,仅需会话初始化,可使用web中间件组 // $this->middleware('web')->middleware('NewMiddleware'); }
2. 全局配置中间件优先级或分组
在bootstrap/app.php中,通过配置中间件组或优先级,确保自定义中间件在会话、认证中间件之后运行:
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { // 方式一:将自定义中间件加入web组(自动继承会话、认证中间件的执行顺序) $middleware->web([ \App\Http\Middleware\NewMiddleware::class, ]); // 方式二:手动设置优先级,明确执行顺序 $middleware->priority([ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Auth\Middleware\Authenticate::class, \App\Http\Middleware\NewMiddleware::class, ]); }) ->create();
3. 直接从请求实例获取用户
如果会话已初始化,也可以直接通过请求实例获取用户ID,效果与Auth::id()一致:
public function handle($request, Closure $next) { $userId = $request->user()?->id; dd($userId); return $next($request); }
内容的提问来源于stack exchange,提问作者UltraMarkus
相关产品推荐
相关产品推荐

