当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Laravel-会话存储未按要求设置》经验,为你挑选了6个好方法。

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

我没有编辑任何核心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']);

我对Laravel没有多少经验,所以请原谅我的无知.我知道有另一个问题要问同样的事情,但这些答案似乎都不适合我.谢谢阅读!

编辑:

这是我的register.blade.php按要求.

@extends('partials.main')

@section('title', 'Test | Register')

@section('content')
    
{!! csrf_field() !!}
@endsection

Cas Bloem.. 140

如果您需要会话状态,CSRF保护等,则需要使用Web中间件.

Route::group(['middleware' => ['web']], function () {
    // your routes here
});

我确实有这个,我只是包括相关的路线. (2认同)


Waiyl Karim.. 51

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

protected $middleware = [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];

该死的,这对我有用,但我不高兴这是一个"修复",而不是解决方案.不管怎么说,还是要谢谢你! (4认同)


George Kagan.. 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',
        ],


Hugh Grigg 葛.. 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,
    ],
];

请注意,VerifyCsrfToken之后StartSession.如果你有不同的顺序,它们之间的依赖关系也会导致Session store not set on request.异常.



1> Cas Bloem..:

如果您需要会话状态,CSRF保护等,则需要使用Web中间件.

Route::group(['middleware' => ['web']], function () {
    // your routes here
});


我确实有这个,我只是包括相关的路线.

2> Waiyl Karim..:

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

protected $middleware = [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];


该死的,这对我有用,但我不高兴这是一个"修复",而不是解决方案.不管怎么说,还是要谢谢你!

3> George Kagan..:

在我的情况下(使用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',
        ],



4> Hugh Grigg 葛..:

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

请注意,VerifyCsrfToken之后StartSession.如果你有不同的顺序,它们之间的依赖关系也会导致Session store not set on request.异常.


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

5> Daan..:

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

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

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

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

解决方法

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

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件.在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:

middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}



6> 小智..:

Laravel [5.4]

我的解决方案是使用全局会话助手: session()

它的功能比$ request-> session()稍微困难一些.

写作:

session(['key'=>'value']);

推动:

session()->push('key', $notification);

检索:

session('key');

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有