Laravel - 会话存储未按要求设置

mat*_*ick 93 php laravel

我最近创建了一个新的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)

  • 如果您的登录路径在 API 中怎么办? (9认同)
  • 我确实有这个,我只是包括相关的路线. (2认同)
  • @ErVipinSingh,您需要在应用程序配置中设置 32 个字符的密钥。或者使用 `php artisan key:generate` (2认同)

Wai*_*rim 51

如果添加你的routes内部web middleware因任何原因不起作用,那么尝试将其添加$middlewareKernel.php

protected $middleware = [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
Run Code Online (Sandbox Code Playgroud)

  • 该死的,这对我有用,但我不高兴这是一个"修复",而不是解决方案.不管怎么说,还是要谢谢你! (4认同)
  • 这是错误的!如果您为每个请求添加此内容,那么您的会话重新生成和登录可能无法工作! (2认同)

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.异常.

  • 是的!我很愚蠢,以为我会按字母顺序重新排序(因为强迫症)并打破了应用程序.不幸的是,直到第二天我都没有测试,这就是为什么我最终来到这里.仅供记录,5.3中"web"中间件组的默认顺序是:EncryptCookies,AddQueuedCookiesToResponse,StartSession,ShareErrorsFromSession,SubstituteBindings,VerifyCsrfToken. (3认同)

Daa*_*aan 15

问题可能是您尝试访问控制器__constructor()功能内的会话 .

从Laravel 5.3+开始,这是不可能的,因为它无论如何都无法工作,如升级指南中所述.

在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户.这从未打算成为框架的明确特征.在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行.

有关更多背景信息,请阅读Taylor的回复.

解决方法

如果您仍想使用它,您可以动态创建中间件并在构造函数中运行它,如升级指南中所述:

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件.在使用此功能之前,请确保您的应用程序正在运行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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 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)


Mar*_*nne 7

就我而言,我将以下 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。