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

时间:2016-11-03 21:31:08

标签: php laravel authentication laravel-5.2 laravel-5.3

我已从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

这些类由Kernel.php

中的protected $routeMiddelware调用

我也调查了\Auth::user() is null in 5.3.6?,这不仅没有解决我的具体问题,我也不认为这是一个很好的解决方案。

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

2 个答案:

答案 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);
    });
}