laravel框架session使用教程

laravel是一款php框架了,在使用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;   //习惯性的调试都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); // 启动session
            $request->setSession($session);
        }
        $response = $this->app->handle($request, $type, $catch); // 调用controller的method
        if ($this->sessionConfigured()) {
            $this->closeSession($session);         //关闭session
            $this->addCookieToResponse($response, $session);
        }
        return $response;
    }
    ...
 
    protected function closeSession(SessionInterface $session)
    {
        $session->save();    // 保存session
        $this->collectGarbage($session);
    }
}
小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。


可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,

那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。



//设置session里的值
public function session1(Request $request){
//1.HTTP request session();
/*$request->session()->put('key1','value1');
echo $request->session()->get('key1');*/

//2.session()
/*session()->put('key2','value2');
echo session()->get('key2'); */

//3.session
//存储数据到session
//Session::put('key3','value3');

//获取session里的数据
//echo Session::get('key3');

//不存在则获取默认的值
//echo Session::get('key4','default');

//以数组的形式存储数据
//Session::put(['key4'=>'value4']);

//把数据放到Session的数组中
/*Session::push('user','yxh');
Session::push('user','imooc');*/

//取出数组的数据
/*$res = Session::get('user','default');
var_dump($res);*/

//取出数据之后就把它删除
/*$res = Session::pull('user','default');
var_dump($res);*/

//取出session中的所有制
/*$res = Session::all();
var_dump($res);*/

//判断session中的某个值是否存在
/*if(Session::has('key1')){
$res = Session::all();
dd($res);
}else{
echo '不存在';
}*/

//删除session中指定的值
//Session::forget('key1');

//清空所有session
//Session::flush();

//设置临时数据,只能访问一次,第二次访问就删除了
//Session::flash('key-flash','flash');
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值