即使使用Web中间件,Laravel 5.2会话值也不会持久存在

时间:2016-01-06 19:29:34

标签: laravel session laravel-5.2

我有一个Laravel 5.2项目,我正在使用它作为我正在构建的javascript客户端的模拟API。稍后将使用不同的Laravel项目替换模拟API功能。目前,我只需要能够提交API调用并获得预期的响应。

在我的模拟API中,我将身份验证状态存储在会话中。

我遇到的问题是我在会话中输入的值不会在http调用之间持续存在。

session put is not persisting gif

这似乎与a different stackoverflow post I found类似,但问题是我已经在为我的API组使用web中间件了。

我认为它可能是我的存储文件夹的权限(我使用默认的file会话驱动程序),vagrant是所有者并具有写访问权限:

storage directory permissions

另外,如果是权限问题,我认为会产生运行时错误。

还有其他我想念的东西吗?

修改

以下是Config::get('session')的内容:

contents of config::get('session')

是的,StartSession类包含在web中间件组中:

StartSession class in web middleware group

以下是浏览器会话cookie与在Web服务器上创建的会话文件的对比:

browser cookie vs session file

以下是请求的内容:

request contents

5 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,并且能够通过替换

来使其工作
Route::group(['middleware' => ['web']], function () {
   ...
});

Route::group(['middlewareGroups' => ['web']], function () {
   ...
});

当所有文档都显示我们使用['middleware' => ['web']]

时,不知道为什么会这样

答案 1 :(得分:2)

这是因为对Laravel进行了更改,默认情况下所有路由都是" web"中间件,所以在routes.php文件中再次分配它最终会分配两次。

解决方案是要删除" web"来自路线的中间件或从RouteServiceProvider中删除自动分配。

在Laravel更新之前:

  // /app/Providers/RouteServiceProvider.php
$router->group(['namespace' => $this->namespace], function ($router) {
    require app_path('Http/routes.php');
});

Laravel更新后:

// /app/Providers/RouteServiceProvider.php
$router->group([
    'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
    require app_path('Http/routes.php');
});

注意新更新如何自动应用" web"中间件到所有路由。如果您希望像以前一样继续使用Laravel 5.2,只需将其删除(在您的routes.php中手动分配" web"中间件)。

答案 2 :(得分:1)

我在5.2

上遇到了同样的问题

如果我在组中注册路由和中间件

,我发现会话有效
Route::group(['middleware' => ['web']], function () {
    Route::get('aktuell', "SeitenController@getAktuell");
    # other routes ... 
});

但如果我在Controllers构造函数中分配中间件

,则不行
function __construct()
{
    $this->middleware('web');
}

(这是我的首选方式..)

通过

明确保存会话
$request->session()->put("test3",time()."-anna");
$request->session()->save();

答案 3 :(得分:0)

为我做的一件事就是确保config / session.php中的域设置为null。

答案 4 :(得分:0)

我遇到了同样的问题,但其他答案都没有帮助我。对我来说,Illuminate\Session\Middleware\StartSession类总是被调用,因此我知道Web中间件被调用了。

当我发现问题时,我遇到了以下thread,其中Taylor Otwell提到你必须在设置会话变量后使用Session::save()。使用它对我有用,但我仍然不知道为什么这解决了这个问题。