【问题标题】:Laravel session data not sticking across page loadsLaravel 会话数据不会跨页面加载
【发布时间】:2014-07-18 00:26:34
【问题描述】:

我尝试运行以下代码:

Session::put('progress', '5%');

dd(Session::get('progress'));

这将在转储中显示“5%”。

如果我重新运行同一页面但注释掉 Session::put('progress', '5%'); 以便只调用 dd() 行,我会得到一个空值,而不是前一页面加载中存储的 5% 值。

这是我的会话配置,所以我知道它应该存储数据:

'driver' => 'native',
'lifetime' => 120,
'expire_on_close' => false,

为什么 Laravel 不跨页面加载存储会话数据?

【问题讨论】:

  • 我相信这是因为您在 Laravel 完成其生命周期之前使用 dd() 杀死脚本,该值未存储到会话中。尝试输入一个不带 dd 的值来完成整个 Laravel 生命周期。然后,在那之后,尝试检索它。

标签: php session laravel laravel-4


【解决方案1】:

问题是因为您在 Laravel 完成其应用程序生命周期之前杀死了脚本,所以放入会话(但尚未存储)的值也被杀死了。

当 Laravel 应用程序生命周期开始时,Session 中的任何值 put 都不会存储,直到应用程序生命周期结束。那就是Session 中的任何值put 最终/实际上将是stored

如果您检查the source,您会发现与上述相同的行为:

 public function put($key, $value)
 {
     $all = $this->all();

     array_set($all, $key, $value);

     $this->replace($all);
 }

如果要测试它,请执行以下操作:

  1. 在会话中存储一个值而不杀死脚本。

    Route::get('test', function() {
        Session::put('progress', '5%');
        // dd(Session::get('progress'));
    });
    
  2. 检索已经存储的值

    Route::get('test', function() {
        // Session::put('progress', '5%');
        dd(Session::get('progress'));
    });
    

【讨论】:

  • 非常好!感谢您不仅提供解决方案,还感谢管道的详细解释。 :)
  • 我可以强制 Laravel 立即写入会话数据吗?我正在尝试使用它来存储通过 AJAX 访问的进程的进度。
  • laravel session 在哪里存储值?我在会话存储中看不到它们。
  • 在全新安装中,会话存储驱动程序是磁盘文件。
  • 非常好的伙计。你有理由救了我的命
【解决方案2】:

Rubens Mariuzzo 的answer 非常好。我只想补充一点,如果您需要立即存储数据,您可以使用 save 方法:

Session::put('progress', '5%');
Session::save();

【讨论】:

  • 谢谢伙计。你拯救了我的一天。
  • 即使您在之后调用“die()”,这对您有用吗?出于某种原因,即使我调用 Session::save(),结果也是一样的。由于某种原因,我必须返回响应才能使其正常工作。我正在使用 L5.2 和 L5.3
  • 刚刚注意到,当会话驱动程序设置为“cookies”时,这种情况不起作用,因为cookies不会立即保存,而是排队等待在结束时一起发送要求。这意味着,如果你 dd(),它不会工作! Sux0rs...
【解决方案3】:

对我来说,即使在数据已正确存储到会话之后:

    dd(Session::all());

什么都不返回,但是:

    print_r(Session::all());

返回所有会话数据!

【讨论】:

    【解决方案4】:

    在我的例子中,我在一个请求中刷新了变量,然后在另一个请求中将其放入会话中(同名)。

    不幸的是,终止方法遍历了所有之前刷新的属性并清理了我新创建的会话属性(它在之前的请求中被刷新,所以 laravel 认为它不再需要并且无法判断它是新创建的)。我想通了调试Kernel->terminateMiddleware 方法。您可以在终止方法中放置一个断点。在某个阶段,它达到Store->ageFlashData。这是负责删除我的属性的方法。

    【讨论】:

      【解决方案5】:

      我移动了会话中间件

      \Illuminate\Session\Middleware\StartSession::class

      到属性 $middleware in

      app/Http/Kernel.php

      在这种情况下,您需要将其从网络组($middlewareGroups)中删除

      对我有帮助,希望对你也有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 2013-08-10
        • 2012-11-27
        • 2021-01-09
        • 1970-01-01
        相关资源
        最近更新 更多