Session
最后更新于:2022-04-01 15:07:04
自定义 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 分享它!