【问题标题】:How does Laravel unset session flash data?Laravel 如何取消设置会话闪存数据?
【发布时间】:2017-06-09 06:20:58
【问题描述】:

我目前正在尝试实现一种类似于 Laravel 处理闪存数据的方式来闪存会话数据。我知道 Laravel 会覆盖被 session_start 等函数调用的本机会话方法。

他们似乎通过为会话创建openreadwrite 等的自定义方法来使用 Symfony 的 Http foundation 包来做到这一点。这是通过使用session_set_save_handler

http://php.net/manual/en/function.session-set-save-handler.php

通过使用该函数,您可以在开始会话或写入会话时实现开放逻辑。但到目前为止,我在 Laravel 代码库中找不到闪存数据未设置的直接逻辑。

在会话的write 功能之前取消设置闪存数据是有意义的。这样您就可以为将来的请求取消设置,并确保它只会在您的代码终止时发生。

谁能告诉我 Laravel 如何处理会话闪存消息?

【问题讨论】:

    标签: php laravel session laravel-5.3 flash-message


    【解决方案1】:

    Illuminate\Session\Store 类中,您可以找到在存储会话时调用的save 方法。本质上就是session_set_save_handler

    https://github.com/laravel/framework/blob/7acc98e112cce4e04f30c7ee4fc0a53dbc5c425b/src/Illuminate/Session/Store.php#L261

    在那一行调用$this->ageFlashData(); 方法。

    该方法包含以下代码

        $this->forget($this->get('_flash.old', []));
        $this->put('_flash.old', $this->get('_flash.new', []));
        $this->put('_flash.new', []);
    

    因此,在页面调用中,所有闪存数据都存储在_flash.new 中。 保存会话后,_flash.old 中的所有数据将被清除,_flash.new 中存储的所有数据都将移至_flash.old_flash.new 准备为下一页调用存储新数据

    如果您想维护 flash 消息,例如在 ajax 调用中,您可以使用会话存储中的 reflash() 方法,该方法将 _flash.old 中的所有内容移回 _flash.new

    【讨论】:

    • 什么时候进行ajax请求或重定向? Laravel 是否也会将闪存数据移至旧数据中,或者是否为此进行了检查?我想如果像 ajax 请求或重定向之类的东西导致闪存数据未设置,你可能会得到不需要的行为。
    • 在 ajax 调用中,闪存数据被移动到 _flash.old。您可以在 StartSession 中间件中看到这一点。如果您想为下一个请求保持闪存数据活动,您可以使用reflash 方法
    猜你喜欢
    • 2021-07-15
    • 2017-01-08
    • 1970-01-01
    • 2016-09-14
    • 2018-04-22
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多