CodeIgniter框架源码笔记(11)——SESSION类之闪出数据FlashData实现

官方说Flashdata闪出数据指的是一种只对下一次请求有效的 session 数据, 之后将会自动被清除
看源码后理解:Flashdata闪出数据对本次请求的页面程序中,随便你调用多少次,当切换页面请求后,闪出数据就无效了
比如,商品列表删除某条记录后,提示“商品:扫地机器人已删除”。或者编辑文章时保存后提示“文章修改成功”或“修改失败,参数错误”等。
flashdata 就是常规的 session 变量,只不过以特殊的方式保存在 ‘__ci_vars’ 键下。
标记一个闪出数据

$this->session->mark_as_flash('item');

设置一个键值对为闪出数据

$this->session->set_flashdata('item', 'value');

在另一个请求中还继续保持 flashdata 变量

$this->session->keep_flashdata('item');

flashdata实现原理,在__ci_vars键中对需要flash的键$key,存一个new标记
即:$_SESSION['__ci_vars'][$key] = 'new';

public function mark_as_flash($key)
{
    //$key是数组的情况下
    if (is_array($key))
    {   
        //先判断所有的键在$_SESSION中是否存在,如果有一个不存在,则终断并返回失败
        for ($i = 0, $c = count($key); $i < $c; $i++)
        {
            if ( ! isset($_SESSION[$key[$i]]))
            {
                return FALSE;
            }
        }
        //到这里,则表示所有键都是存在的
        //现在给所有键初使化值new
        $new = array_fill_keys($key, 'new');

        //将所有键值放入'__ci_vars' 键下
        $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars'])
            ? array_merge($_SESSION['__ci_vars'], $new)
            : $new;

        return TRUE;
    }

    //$key非数组,如果命中则$_SESSION['__ci_vars'][$key] = 'new'
    //
    if ( ! isset($_SESSION[$key]))
    {
        return FALSE;
    }
    //将键值放入'__ci_vars' 键下
    $_SESSION['__ci_vars'][$key] = 'new';
    return TRUE;
}

set_flashdata做了两件事
1、设置session
2、标记为flash数据

public function set_flashdata($data, $value = NULL)
{
    $this->set_userdata($data, $value);//设置session
    $this->mark_as_flash(is_array($data) ? array_keys($data) : $data);//标记为flash数据
}

获取闪出数据

public function flashdata($key = NULL)
{
    //单个键获取
    if (isset($key))
    {
        return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && ! is_int($_SESSION['__ci_vars'][$key]))
            ? $_SESSION[$key]
            : NULL;
    }

    $flashdata = array();
    //获取所有flash闪出数据
    if ( ! empty($_SESSION['__ci_vars']))
    {
        foreach ($_SESSION['__ci_vars'] as $key => &$value)
        {
            is_int($value) OR $flashdata[$key] = $_SESSION[$key];
        }
    }

    return $flashdata;
}

闪出数据失效:
该功能放在了构造函数中

if ($value === 'new')
    $_SESSION['__ci_vars'][$key] = 'old';

这样在下一个页面需要用到session时,$this->load->library(‘session’)闪出数据就失效了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值