Auth :: user()在新路由中为null

时间:2019-11-01 14:14:16

标签: laravel authentication laravel-routing

我正在使用laravel 6,并且在我的应用中有2条路线;索引和仪表板。 我的routes/web是:

Auth::routes();
Route::middleware(['auth'])->group(function () {
    Route::get('/index', 'todoApp\TodoController@index')->name('index');
    Route::get('/dashboard', 'todoApp\Dashboard@dashboard')->name('dashboard');
});

我最近添加了仪表板路线。 Auth::user()为null时,我将其转储到仪表板路线中,但未纳入索引中。什么是

3 个答案:

答案 0 :(得分:0)

我认为这与“网络”中间件有关。如果您查看Kernel.php(在app \ Http中),则会找到Web中间件组。

这将向您显示它实际上调用了名为StartSession的中间件。根据您的路由文件(其中不包含Web作为中间件),我认为您的Controller中没有会话,因此无法访问它。

我不太清楚为什么只在您的/ dashboard路由中发生这种情况,因为问题也应该在/ index路由中(除非您在TodoController中的某个位置添加了Web中间件)。

我认为这应该可以解决问题:

thisClass

答案 1 :(得分:0)

如果您启动php artisan make:auth命令。 定义在哪里都无所谓,因为它仅定义身份验证路由

Route::middleware(['auth'])->group(function () {
    Route::get('/index', 'todoApp\TodoController@index')->name('index');
    Route::get('/dashboard', 'todoApp\Dashboard@dashboard')->name('dashboard');
});
Auth::routes();

答案 2 :(得分:0)

您的控制器在中间件堆栈运行之前被实例化;这就是Laravel如何知道您通过构造函数设置了什么中间件的方法。因此,您此时将无法访问已验证的用户或会话。例如:

public function __construct()
{
    $this->user = Auth::user(); // will always be null
}

如果您需要分配此类变量或访问此类信息,则需要使用控制器中间件,该中间件将在StartSession中间件之后运行在堆栈中:

public function __construct()
{
    $this->middleware(function ($request, $next) {
        // this is getting executed later after the other middleware has ran
        $this->user = Auth::user();

        return $next($request);
    });
}

调用dashboard方法时,中间件堆栈已经将请求一直传递到堆栈的末尾,因此Auth运行并可用所需的所有中间件已经当时就运行了,这就是为什么您可以在那里访问Auth::user()的原因。