3分钟短文:说说Laravel页面会话之间的数据保存Session用法

简介: HTTP请求之间的会话保持

引言

我们知HTTP请求是没有状态的,两个请求之间没有直接的关联关系。但大多数情况下,
我们需要保持用户的会话间数据的连续性,这时,为了数据安全起见,
有必要在服务器上临时存储一些上下文数据了。

图片

这就是 session 设计的目的。

代码时间

在laravel中可以使用系统提供的Session类方便地操作会话数据,而且其存储介质也是抽象出来的,
可以无缝衔接,只是驱动更换一下罢了。

框架内Session支持的驱动类型如下:

  • file 存储在 storage/framework/sessions 目录
  • cookie 存储在安全加密的 cookie 中
  • database 创建专门的表,存储在数据库内
  • memcached, redis 存储在这些内存数据库内
  • array 每次请求有效,用完即焚,适合测试使用

session 数据以简单的键值方式存储,所以读取某个键名的值,只需

session()->get('user_id');

其中函数 session() 是laravel系统提供的助手函数。我们看一下源码的定义:

function session($key = null, $default = null)
{
    if (is_null($key)) {
        return app('session');
    }

    if (is_array($key)) {
        return app('session')->put($key);
    }

    return app('session')->get($key, $default);
}

如果键名为空,返回一个 app('session'),使用应用容器实例化一个Session对象。
其中,别名 session 在门面 IlluminateSupportFacadesSession 内注册的。

因为session是在页面请求之间的保持,所以Request对象也提供了session的方法。
FormRequestServiceProvider 内注册请求体时调用初始化方法:

$request = FormRequest::createFrom($app['request'], $request);

其中 createFrom 方法做了session数据写入:

if ($session = $from->getSession()) {
    $request->setLaravelSession($session);
}

所以有了以上基础,我们就可以这样链式调用获取一个请求所对应的session值:

Route::get('dashboard', function (Request $request) {
    $request->session()->get('user_id');
});

或者使用依赖注入的方式,直接从存储中读取数据:

Route::get('dashboard', function (Illuminate\Session\Store $session) {
    return $session->get('user_id');
});

为了发挥PHP灵活的特点,助手函数session也提供了完整无二的类似 request cache等等的操作方式读写数据。
比如读取某个键的值:

$value = session()->get('key');
$value = session('key');

还有写入值:

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

使用技巧

下面说一些在存储session数据上的用法,以及框架提供的类的方法。
比如直接根据键名获取值:

$points = session()->get('points');

如果键名不存在则使用默认值:

$points = session()->get('points', 0);

来看一下 get 方法的定义,我们会学到更为灵活的用法:

public function get($key, $default = null)
{
    return Arr::get($this->attributes, $key, $default);
}

注意在变量类型提示上,$default 是 mixed 泛型。再接着看 Arr::get() 方法的使用:

if (! static::accessible($array)) {
    return value($default);
}

如果传入的$this->attributes 是数组,那么使用 value() 助手函数取值。
看一下该助手函数的定义:

function value($value)
{
    return $value instanceof Closure ? $value() : $value;
}

我们发现,如果传入的是一个匿名函数,那么直接进行了调用,并返回执行后的值。这样,
我们就可以深度改造一下上面的 session()->get() 方法的第二个 default ,将其传入一个匿名函数,
用于处理获取默认值的逻辑。

看这样一段代码:

$points = session()->get('points', function () {
    return (new PointGetterService)->getPoints();
});

是不是瞬间又有新知识了 :-) 有了匿名函数的支持,这个默认值你可以玩出花儿来了~~

写在最后

本文介绍了laravel处理请求间数据的保持方式:session。比介绍了在程序内获取session的方式,
并深入源码,探索了Session::get() 方法的高阶用法。

Happy coding :-)

我是@程序员小助手,持续分享编程知识,欢迎关注。

相关文章
|
5月前
|
存储 安全 网络协议
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
|
6月前
|
存储 缓存 安全
Django的会话框架提供了一种简单且安全的方式来在用户与网站之间存储和检索状态信息
【5月更文挑战第12天】Django的会话管理依赖于内置的SessionMiddleware。要启用,需在settings.py的MIDDLEWARE中包含它,并确保'django.contrib.sessions'在INSTALLED_APPS内。设置SESSION_ENGINE可选择存储引擎,如默认的数据库或缓存。在视图中,通过request.session交互会话数据。模板可以直接访问这些数据。配置包括会话超时、cookie属性和存储后端。注意,敏感数据不宜存入会话,确保会话cookie安全,考虑使用缓存降低数据库压力。
62 3
|
6月前
uni-app 81聊天类封装(十五)-读取会话功能
uni-app 81聊天类封装(十五)-读取会话功能
33 1
|
6月前
uni-app 76聊天类封装(十一)-更新会话列表(二)
uni-app 76聊天类封装(十一)-更新会话列表(二)
44 1
|
6月前
|
数据安全/隐私保护
Session 管理以及Cookie 应用最简单实例
Session 管理以及Cookie 应用最简单实例
|
6月前
|
存储
通俗解释:Session生成、存储与管理
通俗解释:Session生成、存储与管理
67 0
|
6月前
会话跟踪技术概述及Cookie基本使用
会话跟踪技术概述及Cookie基本使用
53 0
|
12月前
|
存储 移动开发 搜索推荐
Web开发中会话跟踪的方法有哪些?
Web开发中会话跟踪的方法有哪些?
71 0
|
存储
11JavaWeb基础 - 会话简介
11JavaWeb基础 - 会话简介
33 0
|
SQL 数据库 索引
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤