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 分享它!
';