遇到的问题:
有个功能,需要临时记录一个 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'));