Laravel 5.2 即使使用 Web 中间件,会话值也不会保留
Laravel 5.2 Session values not persisting even when web middleware is used
我有一个 Laravel 5.2 项目,我将其用作正在构建的 javascript 客户的模拟 API。稍后将用不同的 Laravel 项目替换模拟 API 功能。现在,我只需要能够提交 API 调用并获得预期的响应。
在我的模拟中 API 我将身份验证状态存储在会话中。
我 运行 遇到的问题是我放入会话中的值在 http 调用之间没有持久化。
这看起来与 相似,但问题是我已经在为我的 API 组使用 web
中间件。
我认为这可能是对我的存储文件夹的权限(我使用的是默认 file
会话驱动程序),vagrant 是所有者并且具有写入权限:
此外,如果这是一个权限问题,我认为它会产生运行时错误。
还有什么我想念的吗?
编辑
这是Config::get('session')
的内容:
是的,StartSession
class 包含在 web
中间件组中:
这是浏览器会话 cookie 与在 Web 服务器上创建的会话文件的对比:
请求内容如下:
我在 5.2
上遇到了同样的问题
我发现如果我在组内注册路由和中间件,会话就可以工作
Route::group(['middleware' => ['web']], function () {
Route::get('aktuell', "SeitenController@getAktuell");
# other routes ...
});
但如果我在控制器构造函数中分配中间件就不会
function __construct()
{
$this->middleware('web');
}
(这是我的首选方式..)
通过
显式保存会话来工作
$request->session()->put("test3",time()."-anna");
$request->session()->save();
我遇到了同样的问题,并且能够通过替换
来让它工作
Route::group(['middleware' => ['web']], function () {
...
});
与
Route::group(['middlewareGroups' => ['web']], function () {
...
});
虽然所有文档都建议我们使用 ['middleware' => ['web']]
,但不知道为什么会这样
对我有用的一件事是确保 config/session.php 中的域设置为空。
这是因为对 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" 中间件),只需在此处将其删除。
我遇到了同样的问题,但 none 的其他答案对我有所帮助。对我来说,Illuminate\Session\Middleware\StartSession
class 总是被调用,因为它必须被调用,所以我知道网络中间件被调用了。
在使用谷歌搜索这个问题时,我遇到了以下 thread,其中 Taylor Otwell 提到您必须在设置会话变量后使用 Session::save()
。使用这个对我有用,但我仍然不知道这解决了问题的原因。
我有一个 Laravel 5.2 项目,我将其用作正在构建的 javascript 客户的模拟 API。稍后将用不同的 Laravel 项目替换模拟 API 功能。现在,我只需要能够提交 API 调用并获得预期的响应。
在我的模拟中 API 我将身份验证状态存储在会话中。
我 运行 遇到的问题是我放入会话中的值在 http 调用之间没有持久化。
这看起来与 web
中间件。
我认为这可能是对我的存储文件夹的权限(我使用的是默认 file
会话驱动程序),vagrant 是所有者并且具有写入权限:
此外,如果这是一个权限问题,我认为它会产生运行时错误。
还有什么我想念的吗?
编辑
这是Config::get('session')
的内容:
是的,StartSession
class 包含在 web
中间件组中:
这是浏览器会话 cookie 与在 Web 服务器上创建的会话文件的对比:
请求内容如下:
我在 5.2
我发现如果我在组内注册路由和中间件,会话就可以工作
Route::group(['middleware' => ['web']], function () {
Route::get('aktuell', "SeitenController@getAktuell");
# other routes ...
});
但如果我在控制器构造函数中分配中间件就不会
function __construct()
{
$this->middleware('web');
}
(这是我的首选方式..)
通过
显式保存会话来工作$request->session()->put("test3",time()."-anna");
$request->session()->save();
我遇到了同样的问题,并且能够通过替换
来让它工作Route::group(['middleware' => ['web']], function () {
...
});
与
Route::group(['middlewareGroups' => ['web']], function () {
...
});
虽然所有文档都建议我们使用 ['middleware' => ['web']]
对我有用的一件事是确保 config/session.php 中的域设置为空。
这是因为对 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" 中间件),只需在此处将其删除。
我遇到了同样的问题,但 none 的其他答案对我有所帮助。对我来说,Illuminate\Session\Middleware\StartSession
class 总是被调用,因为它必须被调用,所以我知道网络中间件被调用了。
在使用谷歌搜索这个问题时,我遇到了以下 thread,其中 Taylor Otwell 提到您必须在设置会话变量后使用 Session::save()
。使用这个对我有用,但我仍然不知道这解决了问题的原因。