【问题标题】:Why is my Laravel 5.7 session not working?为什么我的 Laravel 5.7 会话不起作用?
【发布时间】:2019-02-19 14:27:45
【问题描述】:

我正在尝试让会话在 Laravel 5.7 中工作,但我似乎无法让它工作;我不确定为什么。我查看了官方文档,查看了一堆 SO 帖子,在其他网站上搜索了该问题,但我仍然无法弄清楚。

基本上,我在web.php 中有如下路线:

Route::get('/some_path', 'SomeController@index');

然后,在SomeControllerindex 方法中,我有以下内容:

session(['test', 'Some Value']);
session(['test2', 'Some Other Value']);
session(['test3', 'Some Third Value']);
$value = session('test', 'Backup Value');
echo $value;

这样,我总是在屏幕上回显Backup Value

如果我进入/storage/framework/sessions,我会看到一个包含以下内容的会话文件(我已将其匿名化):

a:5:{s:6:"_token";s:40:"token-here";s:9:"_previous";a:1:{s:3:"url";s:26:"http://example.com/some_path";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}i:0;s:5:"test3";i:1;s:16:"Some Third Value";}

基本上,会话看起来有点工作,但它似乎只存储test3。如果我注释掉控制器中的test3 行,那么它只存储test2。即使我在控制器中只有test 行,它仍然无法检索到值。

我还尝试使用正确的会话迁移文件(例如 https://laravel.com/docs/5.7/session)将会话切换到数据库会话,但它仍然无法正常工作。

基本上,我不知道发生了什么。我可以说我没有使用本地 Laravel 身份验证,所以我不确定这是否重要,但我觉得不应该。另外,我尝试重新启动我的本地主机,但这并没有什么不同,并且运行以下两个命令,这两个命令似乎都没有改变:

php artisan config:clear
php artisan route:clear

最后,我尝试在控制器顶部添加use Session,但这似乎也不重要。

基本上,我不知道该怎么做。这可能是什么原因造成的?谢谢。

【问题讨论】:

  • 可以使用 Laravel 的 session 推送方式。例如Session::push('test', 'some value');
  • 如果你把它放在第一位会发生什么? $value = session('test', '备份值');
  • Deepak Singh、Session::put()Session::push() 有效,但 session() 无效。为什么?技术骑手,改变顺序并没有什么不同。此外,我的部分会话文件现在如下所示:"test";i:1;s:10:"Some Value";s:4:"test";s:10:"Some Value";s:5:"test2";s:16:"Some Other Value"; 基本上,它似乎存储了来自session()Session::put() 的内容,尽管无法检索session()。我还是很困惑。 Laravel 在幕后做了什么来阻止 session() 工作?
  • 另外,对于它的价值,似乎Session 类只允许保存会话的文件方法。我尝试将session.php 中的SESSION_DRIVERfile 更改为database,但它没有保存在数据库中;它仍然保存到storage 目录中的文件中。
  • @HartleySan 更新了答案。检查是否对您有帮助。

标签: php laravel session routes config


【解决方案1】:

这里发生的是当你添加这个时:

session(['test', 'x'])

它在会话的 0th 索引处添加 test,在 1st 处添加 x。 现在当你再次做一个

会话(['test1', 'xx'])
它用新值覆盖会话的 0th1st 索引。 因此,当您打印会话数据时,您将获得最后的值。 您可以通过dd(session()->all()) 进行检查并在屏幕上看到相同的内容。 如果要建立键值关系并将数据存储在这样的地方,请使用如下语法:
session(['test' => 'x']);
session(['test1' => 'xx']);

【讨论】:

  • 好吧,我现在正式觉得自己很蠢。我使用了错误的语法。具体来说,我在做session(['test', 'Some Value']),而我应该做session(['test' => 'Some Value'])。它现在正在使用会话文件,这很好。但是,当我将会话驱动程序切换到database 时,即使有数据库表,它仍然会将会话保存在文件中。有什么想法吗?
  • 如果您已将会话驱动程序正确配置为 db,则不应发生这种情况。确保检查 .env 文件中的 SESSION_DRIVER 是否设置为数据库。还要检查 session.php 文件。最后请运行php artisan config:clear and php artisan cache:clear这两个命令并注销并再次登录并检查数据库中的条目。
  • 煎饼!我终于让它工作了,迪帕克。我没有更改.env 文件中的SESSION_DRIVER 值。 (我不记得在 Laravel 文档中的任何地方都提到过。)无论如何,这一更改立即使一切正常。非常感谢!
  • 干杯伙伴! :)
【解决方案2】:

Laravel 5.7 - 在与文件系统的会话中存储值:

在会话中设置值:

session()->put('email', 'jai@gmail.com');

从会话中获取值:

$email = session()->get('email');

删除邮件会话:

session()->forget('email');

它的作用就像魅力:)

【讨论】:

  • @davefrassoni 确保您已包含“使用 Illuminate\Support\Facades\Session;”在控制器的顶部。
【解决方案3】:

那些无法保存会话的问题是你们忘记在 put 之后放置 save() 函数是示例。

$cartCount = Session::get('cartCount');
        if(empty($cartCount)){
            $cartCount = 0;
            Session::put('cartCount', $cartCount);
        }
        Session::save();

【讨论】:

    【解决方案4】:

    Session::save() 可以挽救生命,如果仍然存在问题,请务必尝试。

    【讨论】:

    • session()->save(); 解决了我的问题。
    【解决方案5】:

    如果由于某种原因您的代码没有运行 - 例如您在某处使用 dd(),那么您的会话将永远无法保存。这让我绊倒了整整 20 分钟。

    【讨论】:

      【解决方案6】:

      在这种情况下,您需要做的就是在您的路由规则中添加一个“web”中间件链功能。 例如

      Route::get('/some_path', 'SomeController@index')->middleware('web');
      

      然后清除缓存:

      php artisan config:clear
      php artisan route:clear
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        相关资源
        最近更新 更多