我正在使用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时,我将其转储到仪表板路线中,但未纳入索引中。什么是
答案 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()
的原因。