Laravel 5.2 - > 5.3 Auth :: user()返回null

Art*_*gio 4 php authentication laravel laravel-5.2 laravel-5.3

我从5.2升级到了5.3,然后Auth::user()又回来了null.

路线

Route::group(['middleware' => ['auth']], function () {
    Route::get('/test', 'MyController@showMain');
}
Run Code Online (Sandbox Code Playgroud)

控制器与构造函数调用Auth::check()返回null

public $user;
public function __construct() {
     $this->user = Auth::user();
}

public function showMain() {
     return $this->user;
}
Run Code Online (Sandbox Code Playgroud)

具有showMain调用Auth::check()返回的控制器User(如预期).

public function __construct() {
    // Nothing
}

public function showMain() {
    return Auth::user();
}
Run Code Online (Sandbox Code Playgroud)

我还看了一下5.3和5.2-> 5.3的全新安装升级之间的区别.5.3中有2个额外的类没有升级版本.

  • Authenticate.php
  • Authorize.php

而且这些类正在由Kernel.phpin 调用protected $routeMiddelware

我还调查了一下\ Auth :: user()在5.3.6中是否为空?,不仅这不能解决我的具体问题,我也不认为这是一个很好的解决方案.

有人可以向我解释为什么我遇到这个问题?

小智 9

从Laravel 5.3开始,无法在控制器构造函数中获取当前登录的用户,因为中间件还没有运行,但在其他控制器方法中,因为你有showMain,所以没有问题.

Laravel迁移指南摘录:

在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户.这从未打算成为框架的明确特征.在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行.

https://laravel.com/docs/5.3/upgrade#5.3-session-in-constructors


Art*_*gio 9

要访问Auth::user()__constructor()(从Laravel 5.3),你需要运行:

public $user;
public function __construct() {
    $this->middleware(function ($request, $next) {
        $this->user = Auth::user();
        return $next($request);
    });
} 
Run Code Online (Sandbox Code Playgroud)