我已经从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个额外的类没有在升级版本中。
- Authenticate.php
- Authorize.php
这些类是由protected $routeMiddelware
Kernel.php
调用的我也研究了'Auth::user()是空在5.3.6?这不仅不能解决我的具体问题,而且我认为这不是一个好的解决方案。
谁能给我解释一下为什么我遇到这个问题?从Laravel 5.3开始,由于中间件尚未运行,因此无法在控制器构造函数中获取当前登录的用户,但在其他控制器方法中,如showMain,获取它没有问题。
Laravel迁移指南节选:
在以前版本的Laravel中,你可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的一个明确特性。在Laravel 5.3中,你不能在控制器的构造函数中访问会话或认证用户,因为中间件还没有运行。
5.3 https://laravel.com/docs/5.3/upgrade -session-in-constructors
要访问__constructor()
中的Auth::user()
(从Laravel 5.3开始),您需要运行:
public $user;
public function __construct() {
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
return $next($request);
});
}