laravel Cache的源码分析

laravel的cache支持很多中驱动 file,redis memcache.
我们从Cache::get() 方法开始,首先这里的Cache 使用了laravel中的门面.

Illuminate\Support\Facades\Cache::class

这个类继承了Facade.php这里类.当需要执行get方法的时候就调用了Facade类中的魔术方法__callStatic方法,该方法就不做解释了,总之就是去laravel容器中获取这个门面类中返回的门面别名,通过这个别名去容器中获取对应的这个对象.(在加载这个框架的时候,框架中提供了很多的ServiceProvider,这些ServiceProvider类中的register方法,这些框架中的ServiceProvider类都继承Illuminate\Support\ServiceProvider类.也有自定义的ServiceProvider,自定义的ServiceProvider 都是放在App\Providers目录下.以ServiceProvider名结尾的类,这些ServiceProvider都继承自Illuminate\Foundation\Support\Providers目录下的类,这写类都继承Illuminate\Support\ServiceProvider所以这些服务提供都继承这个类,在这些类中都实现了register方法,在register方法使用app对象去绑定一个对象对应一个别名的一个形式)
laravel Cache的源码分析_第1张图片
可以看到cache绑定了CacheManager这个对象,在return $instance->$method(...$args);这行就是使用了CacheManager对象调用静态的get方法,
但是在CacheManager中没有这个可调用的方法,只有一个protected get 方法.
这个时候调用哪里呢,我们看CacheManager类的最下面,发现有一个魔术__call方法,原来是走到了这里.
laravel Cache的源码分析_第2张图片
在这个方法中调用了类中的stroe方法
laravel Cache的源码分析_第3张图片
这个方法中允许传入一个name 这个name就是指定使用那种驱动.默认是去获取config/cache.php 中的default的值.
laravel Cache的源码分析_第4张图片
laravel Cache的源码分析_第5张图片
最终主要是通过这个方法来返回的.这个方法中的getConfig方法是去获取config/cache.php文件中的stores.$name的值,返回的是这个对应驱动的一些主要参数.isset($this->customCreators[$config['driver']])这步主要是查看这个驱动是否已经注册过了.避免重复去创建这个驱动对象.然后就是调用这个驱动的方法这个createXxxxDriver方法,我这里使用的驱动是file,所以就是执行createFileDriver方法.
这里写图片描述
laravel Cache的源码分析_第6张图片
这个方法中就是需要传入一个Store对象,这个参数在createFileDriver中是new 了一个FileStore(文件存储)对象作为参数传给repository方法,但是在传入这个文件存储对象前需要new 出这个对象,实例化这个对象前需要传入几个参数,按这个列子上是两个参数.这个主要就是要看你需要的存储对象中构造函数需要的参数了,这个列子上一个file对象,这个$this->app['files']就是通过获取容器中app对象在运行框架中的ServiceProvider中的files对象.
laravel Cache的源码分析_第7张图片
这个对象返回了一个Illuminate\Filesystem\Filesystem以及另一个参数就是要存储文件的文件路径地址.然后返回这个文件存储这个对象到repository方法中,在这个方法中 实例化了一个Illuminate\Cache\Repository类对象并且返回这个对象.所以get()就是执行到了这个类中.

你可能感兴趣的:(laravel,php)