遇到的问题:
有个功能,需要临时记录一个 session 值 first_register = 1,且在另外一个页面在发现 session('first_register') 有值,就显示欢迎操作。但是这个只弹一次,所以在显示后,要立刻删除这个 session 值。
我就用到了 Session::flash() 方法来实现,当前页面处理很顺利,达到了预期效果。
可是在换页面的时候:page1 完成注册后刷新了页面(未调用这个 session('first_register')值),page2 打开的时候发现这个 session 没了。明明未被请求,为什么就没了。
做了几次实验:
页面 sessionFlash.html,创建session :
public function sessionFlash(){
$res = Session::flash('flash_session', date('Y-m-d H:i:s'));
return $res;
}页面 session.html ,显示 session:
public function session(Request $request){
dd($request->session()->all()); //这里用的是 dd,不是 return ;
}先执行页面 sessionFlash.html ,然后使用 session.html 查看,
[ "flash_session" => "2018-12-25 06:21:50", ]
存在,因为未 return,所有会一直存在,这个涉及到 Laravel session 处理机制。
然后去刷新首页或其他完整页面,在回来看 session.html ,发现 flash_session 没了。
再仔细推敲下官方文档:
闪存数据到 Session
有时候你想存入一条缓存的数据,让它只在下一次的请求内有效,则可以使用 flash 方法。使用这个方法保存 session,只能将数据保留到下个 HTTP 请求,然后就会被自动删除。闪存数据在短期的状态消息中很有用:
结论:一定要注意“只能将数据保留到下个 HTTP 请求”,这个 http 请求不一定要你去调用这个 session,只要请求了,就被刷掉了,这是关键。
就算你下个 http 请求未调用 flash_session 这个 session,也会被刷掉。这个和 Session::pull(); 一定要对比来认识。
认识清楚后,才发现我用错了,应该用 Session::pull() 来实现。
最后总结下 Session 接口:
//session的永久保存(在不过期范围内)
Session::put('key', 'value');
//等同于PHP的原生session
$_SESSION['key'] = 'value';
//get操作
$value = Session::get('key', 'default');
//去除操作并删除,类似pop概念
$value = Session::pull('key', 'default');
//检测是否存在key
Session::has('users');
//删除key
Session::forget('key');
//保存key,value
Session::flash('key', 'value');
//取值方法还是一样的
Session::get('key');
//刷新快闪数据时间,保持到下次请求
Session::keep(array('username', 'email'));