您的位置:首页 > 其它

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

2016-08-19 08:27 501 查看
官方说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’)闪出数据就失效了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: