我已从5.2升级 - > 5.3而Auth::user()
正在返回null
。
路线
Route::group(['middleware' => ['auth']], function () {
Route::get('/test', 'MyController@showMain');
}
带有构造函数调用Auth::check()
的 控制器会返回null
public $user;
public function __construct() {
$this->user = Auth::user();
}
public function showMain() {
return $this->user;
}
调用showMain
Auth::check()
的 控制器会返回User
(正如预期的那样)。
public function __construct() {
// Nothing
}
public function showMain() {
return Auth::user();
}
我还看了5.3和5.2-> 5.3升级后的干净安装之间的区别。 5.3中有2个额外的类没有升级版本。
这些类由Kernel.php
protected $routeMiddelware
调用
我也调查了\Auth::user() is null in 5.3.6?,这不仅没有解决我的具体问题,我也不认为这是一个很好的解决方案。
有人可以向我解释为什么我会遇到这个问题?
答案 0 :(得分:9)
从Laravel 5.3开始,无法在控制器构造函数中获取当前登录的用户,因为中间件还没有运行,但在其他控制器方法中,因为你有 showMain ,所以没有问题。
Laravel迁移指南摘录:
在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的明确特征。在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行。
https://laravel.com/docs/5.3/upgrade#5.3-session-in-constructors
答案 1 :(得分:7)
要访问Auth::user()
中的__constructor()
(从Laravel 5.3开始),您需要运行:
public $user;
public function __construct() {
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
return $next($request);
});
}