Laravel 缓存源码分析
在laravel中使用缓存一般是 use Illuminate\Support\Facades\Cache; 缓存门面来调用缓存方法 get set 等等方法
比如使用 Cache::get(); 进入Cache Faced类里发现
Cache 继承了 Illuminate\Support\Facades 当调用get方法时就调用了 Facede类中的 魔术方法__callStatic
最终是从服务容器中获取到 cache这个对象,那么这个服务是什么时候注册到容器的呢
laravel框架里的服务提供者 有的核心服务 在框架启动的时候就已经注册了 有的自定义服务 是在接受请求时
Illuminate\Foundation\Http\Kernel---------> $this->bootstrap(); 这个方法启动引导程序的时候 注册服务的
将config/app里的 服务 执行register方法 注册进容器里面
看下 Cache 服务类
register方法中 有三个绑定 可以看到cache绑定了CacheManager这个对象
在Facede门面中的 __callStatic方法中 最后一行
return $instance->$method(...$args);
也就是相当于 (new CacheManager())->$method(…$args)了
CacheManager 实现了Factory接口 即实现了一个简单工厂,传入存储驱动名,返回对应的驱动实例
进入CacheManager 这个类中 发现 没有 put putMany increment等操作缓存的方法 但是最后一行有个__call魔术方法
调用createXxxxDriver 比如
createFileDriver createMemcachedDriver createArrayDriver createRedisDriver
这里以createRedisDriver为例
$repository = new Repository($store); 根据传入的驱动对象 返回相对应的Respository对象
从源码可以看出, Illuminate\Cache\Repository
实现了代理模式, 具体的实现是交由 Illuminate\Contracts\Cache\Store
来处理,.Repository
主要作用是
- 提供一些便捷操作(可以理解为语法糖)
- Event 事件触发, 包括缓存命中/未命中、写入/删除键值
Illuminate\Contracts\Cache\Store\Store接口 是缓存驱动实际处理缓存如何写入读取删除的类
具体的实现类有 ArrayStore
RedisStore DatabaseStore等等
总结:
从源码中可以看到 运用了两种设计模式 简单工厂和代理模式
简单工厂:Illuminate\Cache\CacheManage 中 根据配置文件里 缓存驱动 来实例化 缓存实例对象
代理模式: Illuminate\Cache\Repository 实现代理模式 具体的实现由
Illuminate\Contracts\Cache\Store这个接口的实现类来处理
还没有评论,来说两句吧...