会话不在 Lumen PHP 框架中持续存在
Posted
技术标签:
【中文标题】会话不在 Lumen PHP 框架中持续存在【英文标题】:Sessions not persisting in Lumen PHP framework 【发布时间】:2015-09-07 23:18:10 【问题描述】:我正在为一个项目使用 Lumen(Laravel 提供)微框架,但我在会话方面遇到了一些问题。我现在只是在测试实现,但是我遇到的问题是,当我设置会话变量然后刷新页面时,不再设置该变量。
在我的 .env 文件中,我有:
SESSION_DRIVER=cookie
而且我知道它正在被拾取,因为当我将其更改为 memcached 时,它会引发错误(因为我没有设置 memcached)。
我也启用了中间件:
$app->middleware([
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
]);
然后在我的控制器中我有:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class SessionController extends Controller
public function index(Request $request)
$request->session()->put('email', 'test@test.com');
$request->session()->save(); // Not sure if this is required
var_dump($request->session()->get('email'));
exit;
return view('session.index', ['test' => $value]);
值是在我加载页面时设置的:
string(13) "test@test.com"
但是当我注释掉设置变量的行,然后刷新页面时,该值为NULL:
// $request->session()->put('email', 'test@test.com');
// $request->session()->save();
var_dump($request->session()->get('email'));
exit;
在浏览器中设置了一个 cookie,但它似乎不是用于会话变量:
laravel_session 2ecef0103418ca82d068ec6a6c6fbec388af9b9e localhost / 2015-06-22T14:59:29.856Z 55 ✓
编辑:如果我将 SESSION_DRIVER 设置为 cookie,则实际设置了 cookie——无论我是否实际设置了会话变量。
我不确定我在哪里出错了,我发现文档不是很全面。
谢谢
【问题讨论】:
cookie 将被加密,因此无法判断这是否是正确的 cookie。请确保您确实启用了 cookie 以使其正常工作。依赖它也不是一件好事,如果可能,您应该真正使用文件驱动程序。 也遇到了类似的问题。就我而言,有时它会设置会话值并且我可以检索它,但是我无法更新会话值或取消设置它。我正在使用文件会话驱动程序。 那个 cookie 总是设置的,只有 55 个字节。如果是加密的会话数据,我认为它会更长,而且看起来不像十六进制数。 Cookie 值不允许包含任意字节(请参阅this),因此您必须对其进行编码。如果你对加密的序列化数组进行 base64 编码,对我来说最短的可能是 64 个字节。 使用dd()
而不是var_dump() + exit
;)
【参考方案1】:
由于您尝试使用 cookie
会话存储,因此您也需要 cookie 中间件。启用的中间件应该是:
$app->middleware([
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
]);
在您的第一个示例中,您在创建会话后立即使用它,以便您能够恢复值。但是,由于 session cookie 本身不是由代码设置的,所以当您返回页面时,不会恢复 session。 "laravel_session" cookie 始终设置,无论您是否使用 cookie 存储。我在一个项目中使用file
存储,但它仍然被设置。
另外,AFAIK,这条线:
$request->session()->save();
没有必要。
documentation 声明:
要启用会话,您必须取消注释其中的所有中间件
$app->middleware()
文件中的$app->middleware()
方法调用。
【讨论】:
谢谢,这就是解决方案!中间件默认设置为 cmets以上是关于会话不在 Lumen PHP 框架中持续存在的主要内容,如果未能解决你的问题,请参考以下文章
Lumen 5.6 - php artisan db:seed 出现错误“类 DatabaseSeeder 不存在”