我有一个Laravel 5.2项目,我正在使用它作为我正在构建的javascript客户端的模拟API。稍后将使用不同的Laravel项目替换模拟API功能。目前,我只需要能够提交API调用并获得预期的响应。
在我的模拟API中,我将身份验证状态存储在会话中。
我遇到的问题是我在会话中输入的值不会在http调用之间持续存在。
这似乎与a different stackoverflow post I found类似,但问题是我已经在为我的API组使用web
中间件了。
我认为它可能是我的存储文件夹的权限(我使用默认的file
会话驱动程序),vagrant是所有者并具有写访问权限:
另外,如果是权限问题,我认为会产生运行时错误。
还有其他我想念的东西吗?
以下是Config::get('session')
的内容:
是的,StartSession
类包含在web
中间件组中:
以下是浏览器会话cookie与在Web服务器上创建的会话文件的对比:
以下是请求的内容:
答案 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()
。使用它对我有用,但我仍然不知道为什么这解决了这个问题。