Laravel 5.1-未根据请求设置会话存储


Laravel 5.1 - Session store not set on request

我试图在WAMP上将Laravel 4.1应用程序升级到5.1,结果出现了以下错误:

Request.php第775行中的RuntimeException:未在上设置会话存储要求

在D: ''wamp''www''laravel-5.1''vendor''laravel''framework''src''Illuminate''Http''Request.php请求->会话()的第775行D: ''wamp''www''laravel-5.1''vendor''laravel''framework''src''Illuminate''Foundation''Http''Middleware''VerifyCsrfToken.phpVerifyCsrfToken->addCookieToResponse(object(Request),object(Response))VerifyCsrfToken->handle(object(Request),object(Closure))位于call_user_func_array(array(object(VerifyCsrfToken),'handle'),array(object(Request),object(Closure))管道->照明''管道{关闭}(对象(请求))Pipeline.php行中的call_user_func(对象(闭包),对象(请求))30在Pipeline->Illuminate''Routing{closure}(object(Request))Pipeline.php行中的call_user_func(对象(闭包),对象(请求))103在ControllerDispatcher.php中的Pipeline->then(object(Closure))第96行ControllerDispatcher->callWithinStack(对象(BrowseController),object(Route),object(Request),'getBrowseRecent')ControllerDispatcher.php第54行ControllerDispatcher->dispatch(object(Route),object(Request),"App''Http''Controllers''BrowseController","getBrowseRecent")Route.php第174行,位于Route->runController(object(Request))Route.php行中Route->run(object(Request))处的Route.php行140703位于路由器->Illuminate''Routing{closure}(对象(请求))Pipeline.php行中的call_user_func(对象(闭包),对象(请求))139在中的Pipeline->Illuminate''Pipeline{closure(object(Request))ViewThrottleMiddleware.php第55行ViewThrottleMiddleware->handle(object(Request),object(Closure))位于call_user_func_array(array(object(ViewThrottleMiddleware),'handle'),array(object(Request),object(Closure))管道->照明''管道{关闭}(对象(请求))Pipeline.php行中的call_user_func(对象(闭包),对象(请求))30在Pipeline->Illuminate''Routing{closure}(object(Request))Pipeline.php行中的call_user_func(对象(闭包),对象(请求))103在管道->然后(对象(闭包))在Router.php的705行路由器->在中运行RouteWithinStack(对象(路由),对象(请求))Router.php第678行,位于中的Router->dispatchToRoute(对象(请求))Router.php第654行,位于Kernel.php中的Router->dispatch(object(Request))第246行内核->Illuminate''Foundation''Http{closure}(对象(请求))位于Pipeline.php行中的call_user_func(对象(闭包),对象(请求))139在中的Pipeline->Illuminate''Pipeline{closure(object(Request))检查MaintenanceMode.php的第44行CheckForMaintenanceMode->句柄(对象(请求),对象(关闭))位于call_user_func_array(array(object(CheckForMaintenanceMode),'handle'),array(object(Request),object(Closure))管道->照明''管道{关闭}(对象(请求))Pipeline.php行中的call_user_func(对象(闭包),对象(请求))103在管道->然后(对象(闭包))在Kernel.php的132行Kernel.php行中的Kernel->sendRequestThroughRouter(object(Request))99在index.php第54行中的内核->句柄(对象(请求))

storage文件夹是可写的,使用的会话驱动程序是file。我在整个项目中搜索了session(),但找不到它。我能做些什么来纠正这个错误?谢谢

session.php如下:

<?php
return [
    'driver' => env('SESSION_DRIVER', 'file'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,
];

编辑1:我发现问题出在控制器上。有一条线:

$this->middleware('csrf', [ 'on' => 'post' ]);

我把它评论出来了,效果很好。但我还不明白为什么它会引起这个问题。

看看@Cas Bloem,他的回答让我大吃一惊:

Laravel-请求时未设置会话存储

这就是为什么它对我不起作用。因为你使用的会话是期望匹配CSRF令牌的(这是我的最佳猜测,我自己也是Laravel的新手)。

此外,如果你转到应用程序->http->中间件->VerifyCsrfToken,这就是你可以向阵列添加不会进行CSRF验证的路由。这加上Cas Bloem的修复(将路由放在routes.php的不同部分)解决了我的问题。我现在只是在localhost上开发/学习,但稍后需要实现

希望这能帮助/澄清问题!