laravel 基础教程 —— Session

添加自定义的 Session 驱动

你须求使用 Session 假面的 extend 方法才能添加额外的 session 驱动到
Laravel 中。你能够在服务提供者的 boot 方法中来调用 extend 方法:

<?php

namespace App\Providers;

use Session;
use App\Extensions\MongoSessionStore;
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()
    {
      //
    }
}

您应当小心你的自定义 session 驱动应该已毕 SessionHandlerInterface
接口。该接口仅包涵了几个大致的需求完成的法子。一个落到实处了的 MongoDB
驱动的布局应当像下边一样:

<?php

namespace 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) {}
}

出于那几个格局并不像缓存的 StoreInterface
那样难于了解。所以,我们就来火速的过一下吧:

  • open 方法一般用于基于文件的 session 存储系统。由于 laravel
    已经有意无意了 file session
    驱动,所以您大概不需求在那几个艺术中加上任何的代码。你可以一直放置其为空方法。事实上,那是一种分外的接口设计(我们将会在前面研讨它),PHP
    必须求我们贯彻这一个办法。
  • close 方法,类似于 open
    方法,你也足以对其开展忽视,对于一大半使得来说根本不需求。
  • read 方法应该按照给定的 $sessionId 重回 session
    中涉及数据的字符串版本。你不必要在仓储或探寻时做任何的系列化或任何的编码操作,因为
    laravel 会为您执行体系化服务。
  • destroy 方法应该从 session 存储中除去所涉嫌的数额。
  • gc 方法应该依照给定的 $lifetime UNIX 时间戳删除 session
    所提到的过期数据。对于所有电动过期能力的种类,比如 Memcached 和
    Redis,你可以直接让那一个点子为空。

假诺您的 session 驱动被登记。你就可以在 config/session.php
配置文件中使用 mongo 驱动了。

闪存数据

偶然你希望在 session
中储存某些数据,但是只同意下一遍呼吁时行使,使用后即消除。那么就可以采纳
flash 方法。那办法在 session
中蕴藏的数量只可以在随着的呼吁中展开访问,并且在今后剔除。闪存的数码一般用来做一些暂时的动静音信:

$request->session()->flash('status', 'Task was successful!');

假若你要求有限支撑闪存的数据到愈来愈多的请求,你可以利用 reflash
方法,它会维持所有的闪存数据到额外的伸手中。假若你只必要保证指定的闪存数据,你可以选择
keep 方法:

$request->session()->reflash();

$request->session()->keep(['username', 'email']);

简介

由于 HTTP
驱动是一种无状态的协商,那寻常意味着服务端并无法了解的了解当前呼吁用户与事先请求用户间的涉嫌,而
Session 提供了那种跨请求用户的解决方案。Laravel 附带了不难统一的 API
来支撑种种后端 session 驱动。对于
MemcachedRedis
和数据库那种流行的后端驱动,Laravel 提供了开箱即用的支撑。

Session

基础用法

访问 Session

第一,让我们来做客 session。我们得以因此 HTTP 请求来拜访 session
的实例。HTTP
请求可以通过在控制器方法中行使项目提示来开展珍爱注入。你应该记得,控制器方法的看重性会由此laravel 的服务容器进行注入:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
  /**
   * Show the profile for the given user.
   *
   * @param Request $request
   * @param int $id
   * @return Response
   */
   public function showProfile(Request $request, $id)
   {
     $value = $request->session()->get('key');

     //
   }
}

当您从 session 中检索值时,你也能够指定一个默许的值到 get
方法的第四个参数,默许值会在 session
未搜索到相应键的值时再次来到。你也得以传递 Closure
作为默许值,如若找不到对应的键,Closure
执行的结果所重回的值将作为默认值:

$value = $request->session()->get('key', 'default');

$value = $request->session()->get('key', function () {
  return 'default'; 
});

如果你希望从 session 中追寻出所有的值,你可以应用 all 方法:

$data = $request->session()->all();

您可以可以选取全局扶助方法 session 来举办值的查找和储存:

Route::get('home', function () {
  // Retrieve a piece of data from the session...
  $value = session('key');

  // Store a piece of data in the session...
  session(['key' => 'value']);
});

看清 session 是还是不是留存某项

您可以利用 has 方法来判断 session 中是不是包括某项,借使存在则赶回
true:

if ($request->session()->has('user')) {
  //
}

在 session 中蕴藏数据

假定您拿走了 session
的实例,你就具有了和尾部数据开展交互的力量,你可以通过各样实例的点子来进展互动。比如,你可以行使
put 方法来在 session 中储存一个新的数量项:

$request->session()->put('key', 'value');

推送内容到 session 中值为数组的项

你可以行使 push 方法来将一个新的值推送到 session
中值为数组的项中。比如,假诺 user.teams 键评释了数组在 session
中的路径,你可以像那样推送新的值到该数组中:

$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();

配置

session 的部署文件被积存在
config/session.php。你应有保险在采取前读书该文件中的配置项注释。Laravel
对配置中的每一项都进展了详尽的申明。默许的,laravel 配置使用的是 file
session
驱动,那对于大部分接纳来说已经够用了。不过在生产条件中要么提出使用
memcached 或者 redis 这种内存级驱动,那对于使用的 session
品质来说会是一个很大的升级换代。

对此每个请求的 session 数据,都会储存在你所定义的 session driver
所在的职分中。下列驱动在 laravel 中得以开箱即用:

  • file – sessions 会存储在 storage/framework/sessions 中。
  • cookie – sessions 会被积存在经过安全加密的 cookies 中。
  • database – sessions 会被积存在你选用中所使用的数据库中。
  • memcached / redis – sessions 会被积存在更快的内存级存储驱动中。
  • array – sessions 会使简单存储在 PHP
    的数组中,并且它无法被跨请求访问。

注意:array 驱动平时是用来开展测试时行使的防止止持久的 session
数据。

使得先决条件

数据库

当使用 database session 驱动时,你需求先创制一个表来存储 session
项。下边的事例是数据库 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')->nullable();
  $table->text('payload');
  $table->integer('last_activity');
});

您也可以应用 session:table Artisan
命令来生成一个数据库会话驱动的迁移表:

php artisan session:table

composer dump-autoload

php artisan migrate

Redis

在行使 Redis session 驱动从前,你要求通过 Composer 安装
predis/predis(~1.0)。

其他 Session 注意事项

Laravel 框架之中采取了 flash 作为 session
其中的一个键,所以你应有幸免使用该名称的键到 session 中。

假定您要求仓储安全加密后的 session 数据,你能够在布局文件中将 encrypt
选项设置为 true

相关文章