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 对象是如何持久化的?