会话如何在 Laravel 5 中工作

Posted

技术标签:

【中文标题】会话如何在 Laravel 5 中工作【英文标题】:How do sessions work in Laravel 5 【发布时间】:2017-09-26 10:38:30 【问题描述】:

我试图了解会话在 Laravel 5(.4) 中是如何工作的。 一方面,如the official documentation 中所述,有两种使用它们的方法:

在 Laravel 中有两种主要的会话数据处理方式:全局会话助手和通过请求实例。

$request->session()->put('key', 'value');

session(['key' => 'value']);

文档说:

通过 HTTP 请求实例使用会话与使用全局会话助手之间几乎没有实际区别。

但从来没有解释过有什么区别。

另一方面是“门面方式”:

Session::put('key', 'value');

最近我发现了这个 Stack Overflow 问题How to use session in laravel 5.2 controller。 train_fox这样指出:

session()->put('key', 'value');

所以总共有四种方式。而且我无法弄清楚为什么或何时使用一种或另一种。有人知道这四个之间的区别吗?

顺便说一句,我可以让会话与 Redis 一起工作的唯一方法是使用最后两种方法。

提前感谢您的启发。

【问题讨论】:

所有都是有效的,你可以使用任何人,关于半径我没有检查过。但所有其他作品都很完美。有些是 Facad,有些是帮助功能,让生活更轻松。 session() 是一个辅助函数。 无论您选择哪种方式,它仍然只是指同一个会话,当我提到会话时,我的意思是相同的会话 ID 和与之关联的相同数据。您使用哪一个并不重要,因为它仍然是同一个会话。我使用会话助手是因为我发现它更方便。 【参考方案1】:

让我们首先考虑外观:

Session::put('key', 'value');

这个门面调用Illuminate\Session\Store::put()

现在让我们考虑函数session()

function session($key = null, $default = null)

    if (is_null($key)) 
        return app('session');
    

    if (is_array($key)) 
        return app('session')->put($key);
    
    // ...

读到这里,我们可以假设session(['a' => 'b']) 的工作方式与session()->put('a', 'b') 类似(因为如果它是一个数组,它会在同一个函数上调用put)。

app('session') 返回Illuminate\Session\SessionManager (https://laravel.com/docs/5.4/facades#facade-class-reference)。 Illuminate\Session\SessionManager 有一个 __call 函数,简而言之就是调用会话的驱动程序。所以这是相同的行为。

现在的区别可能在于$request 函数与所有其他函数(如文档中所写)。根据源代码,它返回一个\Symfony\Component\HttpFoundation\Session\SessionInterfaceSessionInterface 的方法与 Illuminate\Session\Store 不同,所以也许这就是它不同的原因。

好吧,我放弃了。很难理解。我不能再帮你了,我迷路了。我保留这篇文章以备历史需要。

【讨论】:

感谢您的回答。所以如果我理解正确Session::put('key', 'value');session()->put('key', 'value');session(['key' => 'value']); 工作相同。现在$request->session()->put('key', 'value');对我来说仍然是个谜。 对我来说同样的问题。 $request->session()->put('key', 'value'); 不同,我不明白为什么以及有什么不同。这就是我放弃的原因! @louisfischer 你可能对***.com/questions/42547684/…感兴趣

以上是关于会话如何在 Laravel 5 中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库中获取数据以及会话如何在 laravel 中工作? [复制]

Ckeditor 不能在 laravel 5.5 的 vue js 中工作

“限制身份验证会话”如何在 keycloak 中工作

会话如何在 Express.js 和 Node.js 中工作?

如何定义在 Laravel 数据库迁移中工作的非 id 主键?

如何使用外部 api 在 Laravel 应用程序中工作?