[关闭]
@snowdiva 2016-11-09T03:22:28.000000Z 字数 3801 阅读 469

[ Laravel 5.3 文档 ] HTTP层 -- Session

Laravel5.3 Laravel学习 HTTP层 Session

原文地址:Laravel学院


目录:


1、简介

由于HTTP驱动的应用是无状态的,所以我们使用Session来存储用户请求信息。Laravel通过干净、统一的API处理后端各种Session驱动,目前支持的流行后端驱动包括MemcachedRedis数据库

配置

Session配置文件位于config/session.php。默认情况下,Laravel使用的session驱动为文件驱动,这对许多应用而言是没有什么问题的。在生产环境中,你可以考虑使用memcachedredis驱动以便获取更快的session性能。

session驱动定义请求的Session数据存放在哪里,Laravel可以处理多种类型的驱动:

Session驱动预备知识

  1. Schema::create('sessions', function ($table) {
  2. $table->string('id')->unique();
  3. $table->integer('user_id')->nullable();
  4. $table->string('ip_address', 45)->nullable();
  5. $table->text('user_agent')->unllable();
  6. $table->text('payload');
  7. $table->integer('last_activity');
  8. });
  1. php artisan session:table
  2. php artisan migrate

2、使用Session

获取数据

服务容器
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. class UserController extends Controller
  6. {
  7. /**
  8. * 显示指定用户的属性
  9. *
  10. * @param Request $request
  11. * @param int $id
  12. * @return Response
  13. */
  14. public function showProfile($request $request, $id)
  15. {
  16. $value = $request->session()->get('key');
  17. // code...
  18. }
  19. }
  1. $value = $requet->session()->get('key', 'default');
  2. $value = $request->session()->get('key', function() {
  3. return 'default';
  4. });
  1. Route::get('home', function () {
  2. // 从session中获取数据...
  3. $value = session('key');
  4. // 指定默认值...
  5. $value = session('key', 'default');
  6. // 存储数据到session...
  7. session(['key' => 'value']);
  8. });

注:通过HTTP请求实例和辅助函数session处理数据并无实质性差别,这两个方法在测试用例中都可以通过assertSessionHas方法进行测试。

  1. $data = $request->session()->all();
  1. if ($request->session()->has('users')) {
  2. // code...
  3. }
  1. if ($request->session()->exists('users')) {
  2. // code...
  3. }

存储数据

  1. // 通过put方法
  2. $request->session()->put('key', 'value');
  3. // 通过全局辅助函数
  4. session(['key' => 'value']);
  1. $request->session()->push('user.teams', 'developers');
  1. $value = $request->session()->pull('key', 'default');

一次性数据

  1. $request->session()->flash('status', 'Task was successful!');
  1. $request->session()->reflash();
  2. $request->session()->keep(['username', 'email']);

删除数据

  1. $request->session()->forget('key');
  2. $request->session()->flush();

重新生成Session ID

http://www.360doc.com/content/11/1028/16/1542811_159889635.shtml
  1. $request->session()->regenerate();

3、添加自定义Session驱动

实现驱动

  1. <?php
  2. namespace App\Extensions;
  3. class MongoHandler implements SessionHandlerInterface
  4. {
  5. public function open($savePath, $sessionName) {}
  6. public function close() {}
  7. public function read($sessionId) {}
  8. public function write($sessionId, $data) {}
  9. public function destroy($sessionId) {}
  10. public function gc($lifetime) {}
  11. }

注:Laravel默认并安没有附带一个用于包含扩展的目录,你可以将扩展放置在任何地方,这里我们创建一个Extensions目录用于存放MongoHandler

注册驱动

驱动被实现后,需要准备将其注册到框架,要添加额外驱动到 Laravel session 后端,可以使用 Session 门面上的 extends 方法。我们在服务提供者boot 方法中调用该方法:

  1. <?php
  2. namespace App\Providers;
  3. use App\Extensions\MongoSessionStore;
  4. use Illuminate\Support\Facades\Session;
  5. use Illuminate\Support\ServiceProvider;
  6. class SessionServiceProvider extends ServiceProvider
  7. {
  8. /**
  9. * Perform post-registration booting of services.
  10. *
  11. * @return void
  12. */
  13. public function boot()
  14. {
  15. Session::extend('mongo', function($app) {
  16. // Return implementation of SessionHandlerInterface...
  17. return new MongoSessionStore;
  18. });
  19. }
  20. /**
  21. * Register bindings in the container.
  22. *
  23. * @return void
  24. */
  25. public function register()
  26. {
  27. // code...
  28. }
  29. }

session驱动被注册之后,就可以在配置文件 config/session.php 中使用 mongo 驱动了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注