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, ], ]; 

请注意VerifyCsrfTokenStartSession之后。 如果您按照不同的顺序获取这些内容,则它们之间的依赖关系也可能导致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的最后我已经设置了会话