Laravel 的 session() 和 request()->session() 的真正区别是啥?

Posted

技术标签:

【中文标题】Laravel 的 session() 和 request()->session() 的真正区别是啥?【英文标题】:What is the real difference between Laravel's session() and request()->session()?Laravel 的 session() 和 request()->session() 的真正区别是什么? 【发布时间】:2017-12-16 23:40:44 【问题描述】:

我正在研究一个严重依赖会话的 Laravel(5.2) 项目,虽然很新,但我只是好奇 global session() 和 Http request()->session() 除了它们具有不同的访问方式之外还有什么区别并写入会话?

这是我从laravel 5.4 doc 那里获得的一些信息,

不幸的是,这并没有真正让我理解其中的区别。我也 google 和 ***ed 也许我可以找到无济于事的答案。示例是laravel difference of session::flash and request->session->flash,但我对答案不太满意

他们在管理会话数据方面的真正区别是什么?我不介意参考文档所在的位置,或者即使我必须深入研究 laravel 核心。

谢谢

【问题讨论】:

【参考方案1】:

session() 是一个帮助器,可让您更快地访问 request()->session()

请注意,request() 也是一个帮助器,可让您更快地访问请求对象。

没有区别,只是一个捷径。

【讨论】:

感谢您的宝贵回答@tete0148 确实我意识到这些是帮手,我同意。尽管我还没有正确调查为什么 Laravel 将会话与使用会话本身分开访问。引起这种观察的原因是 Laravel 文档本身关于它们都有的差异的文本。所以不幸的是,我仍然必须检查我是否能找到不同之处,然后我才能如实真诚地说“是”,我同意。 当我试图检查核心如何使用请求基类实现会话时,我更加确信一般会话可能与 *in operation 有点不同http 的,即来自 Request 类的。 我在回复中澄清了这一点。这不仅仅是一个捷径,建议坚持使用全局 session() 或 request()->session()。该文件清楚地表明存在实际差异,这在开发过程中确实非常明显。所以,你的断言是非常错误的!【参考方案2】:

我认为这会对您有所帮助: $request->session() 和 session() 都是一样的。

在 Laravel 中有两种处理会话数据的主要方式:session() 助手中的全局函数和通过 $request 实例。

你可以这样使用它

public function testMyMethod(Request $request)

    //$userExist = $request->session()->exists('user_id');
    $userExist = $request->session()->has('user_id');


【讨论】:

【参考方案3】:

不幸的是,Laravel 的注释已经给出了最好的答案;我现在只能证明这一点,因为我曾经注意到过这种情况。

我不明白为什么全局session('key') 拒绝在同一方法中回显$request->session()->put('key', 'value') 的值。希望我能再次遇到这种情况只是为了证明,但我想给你的最后一个回应是:

“没有区别,只是捷径。”

因为就像提到的文档一样,在实践中存在显着差异

【讨论】:

我认为你的问题的答案是因为 Laravel 在请求生命周期结束时存储会话值。 是的,这是有道理的,也许是无法检索存储值的原因

以上是关于Laravel 的 session() 和 request()->session() 的真正区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

req.session.destroy 和护照注销不会破坏客户端的 cookie

如何从 socket.io 中访问 req.session 变量?

用redis存储session,为啥req.session是空

express req.session 对象是如何持久化的?

如何在节点 js 中清除浏览器 cookie 时清除 req.session?

没有 req.session.save() 会话不会保存在 Node.js 中