当前位置: 首页 > 后端技术 > PHP

如何调用laravel缓存?

时间:2023-03-30 00:48:02 PHP

本文档使用版本为laravel5.5cachegetpublicfunctioncache(){$c=\Cache::get('app');如果(!$c){\Cache::put('app','cache',1);}dump($c);//cache}config/app.php'aliases'=>['App'=>Illuminate\Support\Facades\App::class,'Artisan'=>Illuminate\Support\Facades\Artisan::class,'Auth'=>Illuminate\Support\Facades\Auth::class,'Blade'=>Illuminate\Support\Facades\Blade::class,'Broadcast'=>Illuminate\Support\Facades\Broadcast::class,'Bus'=>Illuminate\Support\Facades\Bus::class,'Cache'=>Illuminate\Support\Facades\Cache::class,]使用缓存实际调用的是Illuminate\Support\Facades\Cache,这个映射是怎么做的?public/index.php$response=$kernel->handle($request=Illuminate\Http\Request::capture());bootstarp/app.php$app->singleton(Illuminate\Contracts\Http\Kernel::class,App\Http\Kernel::class);app/http/kernel.phpuseIlluminate\Foundation\Http\Kernel作为HttpKernel;类内核扩展HttpKernel{}Illuminate/Foundation/Http/Kernel.phppublicfunctionhandle($request){try{$request->enableHttpMethodParameterOverride();$response=$this->sendRequestThroughRouter($request);}catch(Exception$e){$this->reportException($e);$response=$this->renderException($request,$e);}catch(Throwable$e){$this->reportException($e=newFatalThrowableError($e));$response=$this->renderException($request,$e);}$this->app['events']->dispatch(newEvents\RequestHandled($request,$response));返回$response;}protectedfunctionsendRequestThroughRouter($request){$this->app->instance('request',$request);Facade::clearResolvedInstance('request');$this->bootstrap();返回(新管道($this->app))->发送($request)->through($this->app->shouldSkipMiddleware()?[]:$this->middleware)->then($this->dispatchToRouter());}publicfunctionbootstrap(){if(!$this->app->hasBeenBootstrapped()){$this->app->bootstrapWith($this->bootstrappers());}}Illuminate/Foundation/Application.phppublicfunctionbootstrapWith(array$bootstrappers){$this->hasBeenBootstrapped=true;foreach($bootstrappersas$bootstrapper){$this['events']->fire('bootstrapping:'.$bootstrapper,[$this]);}$this->make($bootstrapper)->bootstrap($this);$this['events']->fire('bootstrapped:'.$bootstrapper,[$this]);}}Illuminate/Foundation/Bootstrap/RegisterFacades.phppublicfunctionbootstrap(Application$app){Facade::clearResolvedInstances();Facade::setFacadeApplication($app);//将配置/app.php中aliases数组中的Facades类设置别名AliasLoader::getInstance(array_merge($app->make('config')->get('app.aliases',[]),$app->make(PackageManifest::class)->aliases()))->register();}Illuminate/Foundation/AliasLoader.phppublicfunctionload($alias){if(static::$facadeNamespace&&strpos($alias,static::$facadeNamespace)===0){$this->loadFacade($alias);返回真;}//$alias来自config/app.php中的别名数组if(isset($this->aliases[$alias])){//'Route'=>Illuminate\Support\Facades\Route::class,//class_alias为类创建一个别名returnclass_alias($this->aliases[$alias],$alias);}}Illuminate/Support/Facades/Cache.phpclassCacheextendsFacade{/***获取组件的注册名。**@returnstring*/受保护的静态函数getFacadeAccessor(){返回“缓存”;}}Illuminate/Support/Facades/Facade.php这个文件没有getset,只有__callStaticpublicstaticfunction__callStatic($method,$args){$instance=static::getFacadeRoot();if(!$instance){thrownewRuntimeException('Afacaderoothasnotbeenset.');}返回$instance->$method(...$args);}publicstaticfunctiongetFacadeRoot(){returnstatic::resolveFacadeInstance(static::getFacadeAccessor());}protectedstaticfunctionresolveFacadeInstance($name){//这里$name是缓存if(is_object($name)){return$name;}if(isset(static::$resolvedInstance[$name])){returnstatic::$resolvedInstance[$name];}//$app是一个容器对象,实现了ArrayAccess接口,最后调用容器的make方法returnstatic::$resolvedInstance[$name]=static::$app[$name];}IlluminateContainerContainer.phppublicfunctionmake($abstract,array$parameters=[]){返回$this->resolve($abstract,$parameters);}受保护的函数resolve($abstract,$parameters=[]){$abstract=$this->getAlias($abstract);$needsContextualBuild=!空($参数)||!is_null($this->getContextualConcrete($abstract));//如果该类型的一个实例当前作为单例进行管理,我们将//只返回一个现有实例而不是实例化新实例//这样开发人员就可以每次都使用相同的对象实例。如果(isset($this->instances[$abstract])&&!$needsContextualBuild){return$this->instances[$abstract];}$this->with[]=$parameters;$concrete=$this->getConcrete($abstract);//我们准备实例化为绑定注册的具体类型的实例。这将实例化类型,并解析任何//它的“嵌套”依赖递归地直到所有的都得到解决。如果($this->isBuildable($concrete,$abstract)){$object=$this->build($concrete);}else{$object=$this->make($concrete);}//如果我们为此类型定义了任何扩展器,我们将需要遍历它们//并将它们应用于正在构建的对象。//这允许扩展服务,例如更改配置或装饰对象。foreach($this->getExtenders($abstract)as$extender){$object=$extender($object,$this);}//如果请求的类型被注册为单例,我们将希望缓存掉//“内存”中的实例,这样我们可以稍后返回它而无需在每个后续请求中创建对象的//全新实例.如果($this->isShared($abstract)&&!$needsContextualBuild){$this->instances[$abstract]=$object;}$this->fireResolvingCallbacks($abstract,$object);//在返回之前,我们还将已解决的标志设置为“true”并弹出//此构建的参数覆盖。完成这两件事后//我们将准备好返回完全构造的类实例。$this->resolved[$abstract]=true;array_pop($this->with);返回$对象;}Illuminate/Cache/CacheServiceProvider.phppublicfunctionregister(){$this->app->singleton('cache',function($app){returnnewCacheManager($app);});$this->app->singleton('cache.store',function($app){return$app['cache']->driver();});$this->app->singleton('memcached.connector',function(){returnnewMemcachedConnector;});}getset$instance->$method(...$args)laravel中F学院原理与代码分析