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

Posted

技术标签:

【中文标题】Auth::user() 在新路由中为空【英文标题】:Auth::user() is null in new route 【发布时间】:2020-02-27 20:07:14 【问题描述】:

我正在使用 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() 转储到仪表板路由但不在索引中时,Auth::user() 为空。这是什么

【问题讨论】:

您在 Dashboard Controller 中将 Auth::user() 称为哪里?? __constructdashboard 方法中 写入你的控制器。公共函数 __construct() $this->middleware('auth'); 【参考方案1】:

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

这将告诉您它实际上调用了一个名为 StartSession 的中间件。根据您的路由文件(其中 web 不作为中间件包含在内),我认为您的控制器中没有会话并且无法访问它。

我不太明白为什么这只发生在您的 /dashboard 路由中,因为问题也应该出现在您的 /index 路由中(除非您在 TodoController 的某处添加了 Web 中间件)。

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

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

【讨论】:

web 中间件默认已经自动添加到routes/web.php 中的所有路由中。见github.com/laravel/laravel/blob/…。【参考方案2】:

如果你触发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();

【讨论】:

【参考方案3】:

您的控制器在中间件堆栈运行之前被实例化;这就是 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 方法时,中间件堆栈已经将 Request 一直传递到堆栈的末尾,因此 Auth 正常工作和可用所需的所有中间件已经在此时运行这就是为什么你可以在那里访问Auth::user()

【讨论】:

以上是关于Auth::user() 在新路由中为空的主要内容,如果未能解决你的问题,请参考以下文章

两个表进行左连接(LEFT JOIN ) 如何只显示右表中为空值的记录行,左表与右表存在关联的记录不显示。

laravel 4重定向到带有2个参数的路由

Laravel 过滤路由

Laravel 角色和路由身份验证

如何在 Angular 中为所有路由(主路由和所有子路由)应用 canActivate 保护

Auth::user() 不会跨子域传输? - Laravel 5.2