@snowdiva
2016-11-09T03:22:28.000000Z
字数 3801
阅读 469
Laravel5.3 Laravel学习 HTTP层 Session
原文地址:Laravel学院
目录:
由于HTTP驱动的应用是无状态的,所以我们使用Session来存储用户请求信息。Laravel通过干净、统一的API处理后端各种Session驱动,目前支持的流行后端驱动包括Memcached、Redis和数据库。
Session配置文件位于config/session.php。默认情况下,Laravel使用的session驱动为文件驱动,这对许多应用而言是没有什么问题的。在生产环境中,你可以考虑使用memcached、redis驱动以便获取更快的session性能。
session驱动定义请求的Session数据存放在哪里,Laravel可以处理多种类型的驱动:
file - session数据存储在storage/franmework/sessions目录下;cookie - session数据存储在经过加密的安全的cookie中;database - session数据存储在数据库中;memcached/redis - session数据存储memcached/redis中;array - session数据存储在简单PHP数组中,在多个请求之间是非持久化的。 注意:数组驱动通常用于运行测试以避免session数据持久化。
Schema::create('sessions', function ($table) {$table->string('id')->unique();$table->integer('user_id')->nullable();$table->string('ip_address', 45)->nullable();$table->text('user_agent')->unllable();$table->text('payload');$table->integer('last_activity');});
php artisan session:tablephp artisan migrate
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class UserController extends Controller{/*** 显示指定用户的属性** @param Request $request* @param int $id* @return Response*/public function showProfile($request $request, $id){$value = $request->session()->get('key');// code...}}
$value = $requet->session()->get('key', 'default');$value = $request->session()->get('key', function() {return 'default';});
Route::get('home', function () {// 从session中获取数据...$value = session('key');// 指定默认值...$value = session('key', 'default');// 存储数据到session...session(['key' => 'value']);});
注:通过HTTP请求实例和辅助函数
session处理数据并无实质性差别,这两个方法在测试用例中都可以通过assertSessionHas方法进行测试。
$data = $request->session()->all();
if ($request->session()->has('users')) {// code...}
if ($request->session()->exists('users')) {// code...}
// 通过put方法$request->session()->put('key', 'value');// 通过全局辅助函数session(['key' => 'value']);
$request->session()->push('user.teams', 'developers');
$value = $request->session()->pull('key', 'default');
$request->session()->flash('status', 'Task was successful!');
$request->session()->reflash();$request->session()->keep(['username', 'email']);
$request->session()->forget('key');$request->session()->flush();
$request->session()->regenerate();
<?phpnamespace App\Extensions;class MongoHandler implements SessionHandlerInterface{public function open($savePath, $sessionName) {}public function close() {}public function read($sessionId) {}public function write($sessionId, $data) {}public function destroy($sessionId) {}public function gc($lifetime) {}}
注:Laravel默认并安没有附带一个用于包含扩展的目录,你可以将扩展放置在任何地方,这里我们创建一个
Extensions目录用于存放MongoHandler。
open 方法用于基于文件的session存储系统,由于Laravel已经有了一个 file session驱动,所以在该方法中不需要放置任何代码,可以将其置为空方法。close 方法和 open 方法一样,也可以被忽略,对大多数驱动而言都用不到该方法。read 方法应该返回与给定data` 写到持久化存储系统相应的 `sessionId` 对应的数据。
- `gc` 方法销毁大于给定$lifetime 的所有session 数据,对本身拥有过期机制的系统如 Memcached 和 Redis 而言,该方法可以留空。驱动被实现后,需要准备将其注册到框架,要添加额外驱动到 Laravel session 后端,可以使用 Session 门面上的 extends 方法。我们在服务提供者的 boot 方法中调用该方法:
<?phpnamespace App\Providers;use App\Extensions\MongoSessionStore;use Illuminate\Support\Facades\Session;use Illuminate\Support\ServiceProvider;class SessionServiceProvider extends ServiceProvider{/*** Perform post-registration booting of services.** @return void*/public function boot(){Session::extend('mongo', function($app) {// Return implementation of SessionHandlerInterface...return new MongoSessionStore;});}/*** Register bindings in the container.** @return void*/public function register(){// code...}}
session驱动被注册之后,就可以在配置文件 config/session.php 中使用 mongo 驱动了。