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 已经附带了一个fileSession 驱动。所以你不需要在该方法中放置任何代码。PHP 要求必须要有这个方法的实现(这只是一个糟糕的接口设计),你只需要把这个方法置空。close方法跟open方法相似,通常也可以被忽略。对大多数的驱动而言,此方法不是必须的。read方法应当返回与给定的$sessionId相匹配的 Session 数据的字符串格式。在你的自定义的驱动中获取或存储 Session 数据时,不需要进行任何序列化或者其他编码,因为 Laravel 会自动为你执行序列化。write方法将与$sessionId关联的给定的$data字符串写入到一些持久化存储系统,如 MongoDB、Dynamo 等。再次重申,你不需要进行任何序列化或其他编码,因为 Laravel 会自动为你处理这些事情。destroy方法将会从持久化存储中删除与$sessionId相关的数据。gc方法能销毁给定的$lifetime(UNIX 的时间戳)之前的所有数据。对本身拥有过期机制的系统如 Memcached 和 Redis 而言,该方法可以置空。