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

Laravel 5.7中如何在构造函数中获取当前用户ID?

在Laravel 5.7构造函数中获取当前用户ID的正确方式

嘿,这个问题我之前也踩过坑!咱们先搞清楚为啥你现在的代码输出是null:

Laravel的构造函数是在中间件执行之前运行的。你在构造里注册了一个闭包中间件,但这个闭包要等到请求进入控制器方法的时候才会被调用——所以你在构造函数末尾直接dd($this->id)的时候,那个闭包还没执行,$this->id自然还是null。

正确的解决办法

你只需要调整代码的执行时机,确保在中间件完成赋值后再使用$this->id就行,有两种常见的方式:

方式1:在控制器方法中访问用户ID

把需要使用用户ID的逻辑放到控制器的具体方法里,因为中间件会在方法执行前完成赋值:

use Illuminate\Support\Facades\Auth;

class TestController extends Controller {
    public $id;

    public function __construct() {
        $this->middleware('auth');
        $this->middleware(function ($request, $next) {
            $this->id = Auth::user()->id;
            return $next($request);
        });
    }

    public function anyControllerMethod() {
        // 这里就能正常获取到用户ID了
        dd($this->id);
    }
}

方式2:把依赖用户ID的逻辑直接放到中间件闭包里

如果你的初始化逻辑必须在请求早期执行,可以直接把代码写到闭包中间件内部:

use Illuminate\Support\Facades\Auth;

class TestController extends Controller {
    public $id;

    public function __construct() {
        $this->middleware('auth');
        $this->middleware(function ($request, $next) {
            $this->id = Auth::user()->id;
            
            // 在这里直接写需要用到用户ID的初始化逻辑
            // 比如加载用户相关的配置、初始化服务等
            
            return $next($request);
        });
    }
}

额外说明

  • 因为你已经注册了auth中间件,所以闭包里的Auth::user()一定能拿到登录用户(如果用户未登录会直接跳转到登录页,不会走到闭包逻辑)
  • 如果你只是需要在控制器方法里用用户ID,其实也可以直接在方法里调用Auth::id()或者Auth::user()->id,没必要特意在构造里赋值

内容的提问来源于stack exchange,提问作者WO Developers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:23:16