Laravel 5.2 -> 5.3 Auth::user() returning null


Laravel 5.2 -> 5.3 Auth::user() returning null

我已经从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);
    });
}