Laravel5里的Session怎么调用

Laravel5里的Session怎么调用_百度知道
Laravel5里的Session怎么调用
提问者采纳
音色库能余东西其删除行另外音色用Kontakt 5加载
来自团队:
其他类似问题
为您推荐:
session的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Laravel5里的Session怎么调用_百度知道
Laravel5里的Session怎么调用
我有更好的答案
音色库能余东西其删除行另外音色用Kontakt 5加载
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您现在的位置:>>
>>正文内容
laravel session的使用,填一下坑
用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SESSION,本以为移植过来可以很好的运行的,因为没有依赖其他的组件,结果出现了这个
Undefined variable: _SESSION
Laravel的session的配置文件配置在 app/config/session.php 中,使用时可以看看 session 配置文件中可用的选项设定及注释。
Laravel 默认使用 file 的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start(), $_SESSION。Laravel在运行过程中会在app/storage/session/目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。
Laravel除了使用默认的file作为session的实现,还支持cookie, Memcached, Redis 和数据库的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。
laravel的session简要API
Session的API还是比较简单的,大家看看也大概知道是怎么个意思。但是有那么几个还不太好理解。
//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'); &
这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。
laravel的session中flash概念
但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。
//保存key,value &
Session::flash('key',&'value'); &
//取值方法还是一样的 &
Session::get('key'); &
//刷新快闪数据时间,保持到下次请求 &
Session::keep(array('username',&'email')); &
这个flash的概念和上面的put的概念不太一样。
put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。
也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。
这中情况的使用场景比如有:
用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。
用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)
session落地的时间
我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:
class&LoginController&{ &
&&&&public&function&login(){ &
&&&&&&&&Session::put('key','value');& &
&&&&&&&&print_r(&Session::all()&);&//取出来看看是否put成功 &
&&&&&&&&&&&//习惯性的调试都exit,不执行后续代码 &
&&&&&&&&//return&Redirect::to(/);&框架在return后还会有后续的代码执行的 &
结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。
后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。
查看调用相关的代码。laravel编译后,在bootstrap/compiled.php中
class&Middleware&implements&HttpKernelInterface &
&&&&public&function&handle(Request&$request,&$type&=&HttpKernelInterface::MASTER_REQUEST,&$catch&=&true) &
&&&&&&&&$this-&checkRequestForArraySessions($request); &
&&&&&&&&if&($this-&sessionConfigured())&{ &
&&&&&&&&&&&&$session&=&$this-&startSession($request);&&
&&&&&&&&&&&&$request-&setSession($session); &
&&&&&&&&} &
&&&&&&&&$response&=&$this-&app-&handle($request,&$type,&$catch);&&
&&&&&&&&if&($this-&sessionConfigured())&{ &
&&&&&&&&&&&&$this-&closeSession($session);&&&&&&&&&&
&&&&&&&&&&&&$this-&addCookieToResponse($response,&$session); &
&&&&&&&&} &
&&&&&&&&return&$response; &
&&&&protected&function&closeSession(SessionInterface&$session) &
&&&&&&&&$session-&save();&&&&&
&&&&&&&&$this-&collectGarbage($session); &
小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=&true。可以看到函数的调用关系。
可以看见,在调用完controller之后,调用了session-&save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

我要回帖

 

随机推荐