Laravel 8 实现驱动
你自定义的 Session 驱动必须实现 SessionHandlerInterface
接口。这个接口包含了一些我们需要实现的简单方法。下面是 MongoDB 实现的大概流程示例:
<?php
namespace App\Extensions;
class MongoSessionHandler 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) {}
}
技巧:Laravel 默认没有附带一个用于包扩展的目录,你可以把它放在你喜欢的目录内。在上面这个例子中,我们创建了一个
Extensions
目录用于存放MongoSessionHandler
。
由于以上方法并不是很容易理解,所以我们接下来每一个方法快速过一遍:
open
方法通常用于基于文件的 Session 存储系统。因为 Laravel 已经附带了一个file
Session 驱动。所以你不需要在该方法中放置任何代码。PHP 要求必须要有这个方法的实现(这只是一个糟糕的接口设计),你只需要把这个方法置空。close
方法跟open
方法相似,通常也可以被忽略。对大多数的驱动而言,此方法不是必须的。read
方法应当返回与给定的$sessionId
相匹配的 Session 数据的字符串格式。在你的自定义的驱动中获取或存储 Session 数据时,不需要进行任何序列化或者其他编码,因为 Laravel 会自动为你执行序列化。write
方法将与$sessionId
关联的给定的$data
字符串写入到一些持久化存储系统,如 MongoDB、Dynamo 等。再次重申,你不需要进行任何序列化或其他编码,因为 Laravel 会自动为你处理这些事情。destroy
方法将会从持久化存储中删除与$sessionId
相关的数据。gc
方法能销毁给定的$lifetime
(UNIX 的时间戳)之前的所有数据。对本身拥有过期机制的系统如 Memcached 和 Redis 而言,该方法可以置空。