Session

自定义 session 驱动来扩展 Laravel 和扩展缓存系统一样简单。我们将会再一次使用 extend 方法来注册自定义代码:

Session::extend("mongo", function($app)
{
    // Return implementation of SessionHandlerInterface
});

在哪里扩展 Session

你应该把 session 扩展代码放置在 AppServiceProvider 的 boot 方法里。

实现 Session 扩展

要注意我们的自定义缓存驱动应该要实现 SessionHandlerInterface 。这个接口只包含少数需要实现的简单方法。一个基本的 MongoDB 实现会看起来像这样:

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 一样容易理解,让我们快速地看过这些方法做些什么:

  1. open 方法通常会被用在基于文件的 session 保存系统。因为 Laravel 附带一个 file session 驱动,几乎不需要在这个方法放任何东西。你可以让它留空。PHP 要求我们去实现这个方法,事实上明显是个差劲的接口设计 (我们将会晚点讨论它)。
  2. close 方法,就像 open 方法,通常也可以忽略。对大部份的驱动来说,并不需要它。
  3. read 方法应该返回与给定 $sessionId 关联的 session 数据的字串形态。当你的驱动取回或保存 session 数据时不需要做任何序列化或进行其他编码,因为 Laravel 将会为你进行序列化
  4. write 方法应该写入给定 $data 字串与 $sessionId 的关联到一些永久存储系统,例如:MongoDB、 Dynamo、等等。
  5. destroy 方法应该从永久存储移除与 $sessionId 关联的数据。
  6. gc 方法应该销毁所有比给定 $lifetime UNIX 时间戳记还旧的 session 数据。对于会自己过期的系统如 Memcached 和 Redis,这个方法可以留空。

当 SessionHandlerInterface 实现完成,我们准备好要用 Session 管理者注册它:

Session::extend("mongo", function($app)
{
    return new MongoHandler;
});

当 session 驱动已经被注册,我们可以在 config/session.php 配置文件使用 mongo 驱动。

注意: 记住,如果你写了个自定义 session 处理器,请在 Packagist 分享它!

文章导航