我最近创建了一个新的Laravel项目,并遵循身份验证指南.当我访问我的登录或注册路由时,我收到以下错误:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Run Code Online (Sandbox Code Playgroud)
我没有编辑任何核心Laravel文件,我只创建了视图并将路由添加到我的routes.php文件中
// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']);
// Registration routes
Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']);
Run Code Online (Sandbox Code Playgroud)
我对Laravel没有多少经验,所以请原谅我的无知.我知道有另一个问题要问同样的事情,但这些答案似乎都不适合我.谢谢阅读!
编辑:
这是我的register.blade.php按要求.
@extends('partials.main')
@section('title', 'Test | Register')
@section('content')
<form method="POST" action="/auth/register">
{!! csrf_field() !!}
<div class="ui input">
<input type="text" name="name" value="{{ old('name') }}" placeholder="Username">
</div>
<div class="ui input">
<input type="email" name="email" value="{{ old('email') }}" placeholder="Email">
</div>
<div class="ui input">
<input type="password" name="password" placeholder="Password">
</div>
<div class="ui input">
<input type="password" name="password_confirmation"placeholder="Confirm Password">
</div>
<div>
<button class="ui primary button" type="submit">Register</button>
</div>
</form>
@endsection
Run Code Online (Sandbox Code Playgroud)
Cas*_*oem 140
如果您需要会话状态,CSRF保护等,则需要使用Web中间件.
Route::group(['middleware' => ['web']], function () {
// your routes here
});
Run Code Online (Sandbox Code Playgroud)
Wai*_*rim 51
如果添加你的routes内部web middleware因任何原因不起作用,那么尝试将其添加$middleware到Kernel.php
protected $middleware = [
//...
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
Run Code Online (Sandbox Code Playgroud)
Geo*_*gan 39
在我的情况下(使用Laravel 5.3),仅添加以下2个中间件允许我访问API路由中的会话数据:
\App\Http\Middleware\EncryptCookies::class\Illuminate\Session\Middleware\StartSession::class整个声明($middlewareGroups在Kernel.php中):
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
'throttle:60,1',
'bindings',
],
Run Code Online (Sandbox Code Playgroud)
Hug*_*葛修远 19
如果Cas Bloem的答案不适用(即您确实web在适用的路由上获得了中间件),您可能需要检查HTTP内核中的中间件的顺序.
默认顺序Kernel.php是:
$middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Run Code Online (Sandbox Code Playgroud)
请注意,VerifyCsrfToken之后StartSession.如果你有不同的顺序,它们之间的依赖关系也会导致Session store not set on request.异常.
Daa*_*aan 15
问题可能是您尝试访问控制器__constructor()功能内的会话 .
从Laravel 5.3+开始,这是不可能的,因为它无论如何都无法工作,如升级指南中所述.
在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户.这从未打算成为框架的明确特征.在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行.
有关更多背景信息,请阅读Taylor的回复.
解决方法
如果您仍想使用它,您可以动态创建中间件并在构造函数中运行它,如升级指南中所述:
作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件.在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:
Run Code Online (Sandbox Code Playgroud)<?php namespace App\Http\Controllers; use App\User; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class ProjectController extends Controller { /** * All of the current user's projects. */ protected $projects; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware(function ($request, $next) { $this->projects = Auth::user()->projects; return $next($request); }); } }
小智 15
我正在使用 Laravel 7.x,出现了这个问题..以下修复了它:
转到kernel.php并将这两个类添加到protected $middleware
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
Run Code Online (Sandbox Code Playgroud)
小智 13
Laravel [5.4]
我的解决方案是使用全局会话助手: session()
它的功能比$ request-> session()稍微困难一些.
写作:
session(['key'=>'value']);
Run Code Online (Sandbox Code Playgroud)
推动:
session()->push('key', $notification);
Run Code Online (Sandbox Code Playgroud)
检索:
session('key');
Run Code Online (Sandbox Code Playgroud)
就我而言,我将以下 4 行添加到 $middlewareGroups(在 app/Http/Kernel.php 中):
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
'throttle:60,1',
'bindings',
],
Run Code Online (Sandbox Code Playgroud)
重要提示:必须在 'throttle' 和 'bindings' 之前添加 4 个新行!
否则会出现“CSRF 令牌不匹配”错误。我已经在这方面挣扎了几个小时,只是为了发现订单很重要。
这允许我在我的 API 中访问会话。我还添加了 VerifyCsrfToken,因为当涉及 cookie/sessions 时,需要处理 CSRF。
| 归档时间: |
|
| 查看次数: |
102210 次 |
| 最近记录: |