您好,欢迎访问一九零五行业门户网

[ Laravel 5.2 文档 ] 服务 -- Session

1、简介 由于http驱动的应用是无状态的,所以我们使用session来存储用户请求信息。laravel通过干净、统一的api处理后端各种session驱动,目前支持的流行后端驱动包括 memcached、 redis和 数据库。
1.1 配置
session配置文件位于 config/session.php。默认情况下,laravel使用的 session驱动为文件驱动,这对许多应用而言是没有什么问题的。在生产环境中,你可能考虑使用 memcached或者 redis驱动以便获取更快的session性能。
session驱动定义请求的session数据存放在哪里,laravel可以处理多种类型的驱动:
file – session数据存储在  storage/framework/sessions目录下; cookie – session数据存储在经过加密的安全的cookie中; database – session数据存储在数据库中 memcached /  redis – session数据存储在memcached/redis中; array – session数据存储在简单php数组中,在多个请求之间是非持久化的。
注意:数组驱动通常用于运行测试以避免session数据持久化。
1.2 session驱动预备知识
数据库
当使用 databasesession驱动时,需要设置表包含 session项,下面是该数据表的表结构声明:
schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->text('payload'); $table->integer('last_activity');});
你可以使用artisan命令 session:table来生成迁移:
php artisan session:tablecomposer dump-autoloadphp artisan migrate
redis
在laravel中使用redis session驱动前,需要通过composer安装 predis/predis包。
1.3 其它session相关问题
laravel框架内部使用 flashsession键,所以你不应该通过该名称添加数据项到session。
如果你需要所有存储的session数据经过加密,在配置文件中设置 encrypt配置为 true。
2、基本使用 访问session
首先,我们来访问session,我们可以通过http请求访问session实例,可以在控制器方法中通过类型提示引入请求实例,记住,控制器方法依赖通过laravel服务容器注入:
session()->get('key'); // }}
从session中获取数据的时候,还可以传递默认值作为第二个参数到 get方法,默认值在指定键在session中不存在时返回。如果你传递一个闭包作为默认值到 get方法,该闭包会执行并返回执行结果:
$value = $request->session()->get('key', 'default');$value = $request->session()->get('key', function() { return 'default';});
如果你想要从session中获取所有数据,可以使用 all方法:
$data = $request->session()->all();
还可以使用全局的php函数 session来获取和存储session中的数据:
route::get('home', function () { // 从session中获取数据... $value = session('key'); // 存储数据到session... session(['key' => 'value']);});
判断session中是否存在指定项
has方法可用于检查数据项在session中是否存在。如果存在的话返回 true:
if ($request->session()->has('users')) { //}
在session中存储数据
获取到session实例后,就可以调用多个方法来与底层数据进行交互,例如, put方法存储新的数据到session中:
$request->session()->put('key', 'value');
推送数据到数组session
push方法可用于推送数据到值为数组的session,例如,如果 user.teams键包含团队名数组,可以像这样推送新值到该数组:
$request->session()->push('user.teams', 'developers');
获取并删除数据
pull方法将会从session获取并删除数据:
$value = $request->session()->pull('key', 'default');
从session中删除数据项
forget方法从session中移除指定数据,如果你想要从session中移除所有数据,可以使用 flush方法:
$request->session()->forget('key');$request->session()->flush();
重新生成session id
如果你需要重新生成session id,可以使用 regenerate方法:
$request->session()->regenerate();
2.1 一次性数据
有时候你可能想要在session中存储只在下个请求中有效的数据,可以通过 flash方法来实现。使用该方法存储的session数据只在随后的http请求中有效,然后将会被删除:
$request->session()->flash('status', 'task was successful!');
如果你需要在更多请求中保持该一次性数据,可以使用 reflash方法,该方法将所有一次性数据保留到下一个请求,如果你只是想要保存特定一次性数据,可以使用 keep方法:
$request->session()->reflash();$request->session()->keep(['username', 'email']);
3、添加自定义session驱动 要为laravel后端session添加更多驱动,可以使用session门面上的 extend方法。可以在服务提供者的 boot方法中调用该方法:
需要注意的是自定义session驱动需要实现 sessionhandlerinterface接口,该接口包含少许我们需要实现的方法,一个mongodb的实现如下:
由于这些方法并不像缓存的 storeinterface接口方法那样容易理解,我们接下来快速过一遍每一个方法:
  open 方法用于基于文件的session存储系统,由于laravel已经有了一个  file session 驱动,所以在该方法中不需要放置任何代码,可以将其置为空方法。 close 方法和 open 方法一样,也可以被忽略,对大多数驱动而言都用不到该方法。 read 方法应该返回与给定$sessionid 相匹配的session数据的字符串版本,从驱动中获取或存储session数据不需要做任何序列化或其它编码,因为laravel已经为我们做了序列化。 write 方法应该讲给定 $data 写到持久化存储系统相应的 $sessionid , 例如mongodb, dynamo等等。 destroy 方法从持久化存储中移除  $sessionid 对应的数据。 gc 方法销毁大于给定$lifetime 的所有 session数据,对本身拥有过期机制的系统如 memcached 和redis而言,该方法可以留空。 session驱动被注册之后,就可以在配置文件 config/session.php中使用 mongo驱动了。
其它类似信息

推荐信息