由于 HTTP 协定是无状态(Stateless)的,所以 session 提供一种保存用户数据的方法。Laravel 支持了多种 session 后端驱动,并通过清楚、统一的 API 提供使用。也内置支持如 Memcached、Redis 和数据库的后端驱动。
session 的配置文件配置在 config/session.php
中,请务必看一下 session 配置文件中可用的选项配置及注释。Laravel 默认使用 file
的 session 驱动,它在大多的应用中可以良好运作。
如果你想在 Laravel 中使用 Redis
sessions,你需要先通过 Composer 安装 predis/predis
扩展包 (~1.0)。
注意: 如果你需要加密所有的 session 数据,就将选项
encrypt
配置为true
。
注意: 当你使用
cookie
作为 session 驱动时, 你永远不应该从 HTTP Kernel 中移除EncryptCookie
中间件。如果你移除了这个中间件,你的应用容易遭受远程代码攻击。
Laravel 框架在内部有使用 flash
作为 session 的键值,所以应该避免 session 使用此名称。
获取 session 有很多种方式,可以通过 HTTP request 类的 session
方法,Session
facade 或者 session
辅助函数。如果在调用 session
辅助函数时没有传入参数,会返回整个 session 对象。比如:
session()->regenerate();
Session::put('key', 'value');
session(['key' => 'value']);
Session::push('user.teams', 'developers');
$value = Session::get('key');
$value = session('key');
$value = Session::get('key', 'default');
$value = Session::get('key', function() { return 'default'; });
$value = Session::pull('key', 'default');
$data = Session::all();
if (Session::has('users'))
{
//
}
Session::forget('key');
Session::flush();
Session::regenerate();
有时你可能希望暂存一些数据,并只在下次请求有效。你可以使用 Session::flash
方法来达成目的:
Session::flash('key', 'value');
Session::reflash();
Session::keep(['username', 'email']);
当使用 database
session 驱动时,你必需建置一张保存 session 的数据表。下方例子使用 Schema
来建表:
Schema::create('sessions', function($table)
{
$table->string('id')->unique();
$table->text('payload');
$table->integer('last_activity');
});
当然你也可以使用 Artisan 命令 session:table
来建 migration 表:
php artisan session:table
composer dump-autoload
php artisan migrate
session 配置文件中的“driver”定义了 session 数据将以哪种方式被保存。Laravel 提供了许多良好的驱动:
file
- sessions 将保存在 storage/framework/sessions
。cookie
- sessions 将安全保存在加密的 cookies 中。database
- sessions 将保存在你的应用程序数据库中。memcached
/ redis
- sessions 将保存在一个高速缓存的系统中。array
- sessions 将单纯的以 PHP 数组保存,只存活在当次请求。注意: array 驱动典型应用在 unit tests 环境下,所以不会留下任何 session 数据。