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

