Laravel 5.5:如何在控制器构造函数中获取Auth用户数据?某SO答案无效
在Laravel 5.5控制器构造函数中获取Auth用户的可行方案
嘿,我太懂你遇到的这个问题了!在Laravel 5.5里直接在控制器构造函数里调用Auth::user()或者auth()->user()确实拿不到数据——因为这时候负责处理会话和认证的中间件还没执行呢!之前那个方案不管用的话,试试这两个靠谱的办法:
方法一:利用中间件闭包获取用户
把获取用户的逻辑放到构造函数里的中间件回调中,这样会在中间件执行周期内拿到已认证的用户:
public function __construct() { // 先确保应用认证中间件(如果需要强制登录的话) $this->middleware('auth'); // 通过中间件闭包获取用户并赋值给控制器属性 $this->middleware(function ($request, $next) { // 这里就能正常拿到用户了 $this->currentUser = auth()->user(); // 你可以在这里做一些初始化操作,比如给视图共享用户数据 view()->share('currentUser', $this->currentUser); return $next($request); }); }
之后在控制器的其他方法里,直接用$this->currentUser就能访问用户数据啦。
方法二:延迟初始化用户属性
如果不想用中间件闭包,也可以给控制器定义一个获取用户的属性方法,延迟到实际需要的时候再获取:
protected $user; public function __construct() { $this->middleware('auth'); } protected function getUser() { if (!$this->user) { $this->user = auth()->user(); } return $this->user; } // 在控制器方法里这样用 public function index() { $user = $this->getUser(); return view('dashboard', ['user' => $user]); }
这种方式的好处是用户数据只会在第一次调用的时候加载,避免不必要的重复查询。
为什么之前的方法无效?
Laravel的请求周期里,控制器是在中间件执行之前就实例化的。直接在构造函数里调用auth()->user()时,StartSession和Authenticate这些关键中间件还没运行,会话还没加载,认证状态也还没初始化,自然拿不到用户数据。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

