Laravel 5.4 使用 Session::flash 遇到的坑

原创 Laravel
阅读数: 1400 2018年12月25日

遇到的问题:

有个功能,需要临时记录一个 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'));



phpriji.cn | 网站地图 | 沪ICP备17015433号-1