Laravel – 会话存储未根据请求设置
我最近创build了一个新的Laravel项目,并沿着关于authentication的指南。 当我访问我的login或注册路线时,我得到以下错误:
ErrorException in Request.php line 775: Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
我没有编辑任何核心的Laravel文件,我只创build了视图,并添加了路线到我的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']);
我对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
如果您需要会话状态,CSRF保护等,则需要使用Web中间件 。
Route::group(['middleware' => ['web']], function () { // your routes here });
如果在web middleware
内部添加routes
不起任何作用,请尝试将此$middleware
添加到Kernel.php
protected $middleware = [ //... \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, ];
如果Cas Bloem的答案不适用(即,您确实已经在适用的路由上获得了web
中间件),那么您可能需要检查HTTP Kernel中的中间件的顺序。
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, ], ];
请注意VerifyCsrfToken
在StartSession
之后。 如果您按照不同的顺序获取这些内容,则它们之间的依赖关系也可能导致Session store not set on request.
例外。
就我而言(使用Laravel 5.3)只添加以下2个中间件允许我访问我的API路由中的会话数据:
-
\App\Http\Middleware\EncryptCookies::class
-
\Illuminate\Session\Middleware\StartSession::class
整个声明(Kernel.php中的$middlewareGroups
):
'api' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class, 'throttle:60,1', 'bindings', ],
Laravel [5.4]
我的解决scheme是使用全局会话助手: 会话()
它的function比$ request-> session()有点难。
写作 :
session(['key'=>'value']);
推动 :
session()->push('key', $notification);
检索 :
session('key');
一个问题可能是您尝试访问您的控制器的__constructor()
函数内部的会话。
从Laravel 5.3+开始,这是不可能的,因为无论如何, 正如升级指南中所述 ,无法工作。
在之前的Laravel版本中,您可以访问会话variables或控制器构造函数中已通过身份validation的用户。 这从来没有打算成为框架的明确特征。 在Laravel 5.3中,由于中间件尚未运行,因此无法访问控制器构造函数中的会话或已authentication的用户。
有关更多背景信息,请阅读泰勒的回答。
解决方法
如果您仍想使用它,可以dynamic创build一个中间件并在构造器中运行它,如升级指南中所述:
作为替代,您可以直接在控制器的构造函数中定义一个基于Closure的中间件。 在使用此function之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:
<?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); }); } }
在我的情况下,这只是放回去; 在function的最后我已经设置了会话