laravel cache get是怎么调用的?

2022-05-15 0 806

下面由laravel教程栏目给大家介绍laravel cache get 是如何调用的,希望对需要的朋友有所帮助!

本文使用版本为laravel5.5

cache get

public function cache()    {        $c=\\Cache::get('app');        if(!$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,                ]

使用cache实际调用的是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.php

use Illuminate\\Foundation\\Http\\Kernel as HttpKernel;class Kernel extends HttpKernel{}

Illuminate/Foundation/Http/Kernel.php

public function handle($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 = new FatalThrowableError($e));        $response = $this->renderException($request, $e);    }    $this->app['events']->dispatch(        new Events\\RequestHandled($request, $response)    );    return $response;}protected function sendRequestThroughRouter($request)    {        $this->app->instance('request', $request);        Facade::clearResolvedInstance('request');        $this->bootstrap();        return (new Pipeline($this->app))                    ->send($request)                    ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)                    ->then($this->dispatchToRouter());    }    public function bootstrap()    {        if (! $this->app->hasBeenBootstrapped()) {            $this->app->bootstrapWith($this->bootstrappers());        }    }

Illuminate/Foundation/Application.php

public function bootstrapWith(array $bootstrappers)    {        $this->hasBeenBootstrapped = true;        foreach ($bootstrappers as $bootstrapper) {            $this['events']->fire('bootstrapping: '.$bootstrapper, [$this]);            $this->make($bootstrapper)->bootstrap($this);            $this['events']->fire('bootstrapped: '.$bootstrapper, [$this]);        }    }

Illuminate/Foundation/Bootstrap/RegisterFacades.php

public function bootstrap(Application $app)    {        Facade::clearResolvedInstances();        Facade::setFacadeApplication($app);//将config/app.php 里的aliases数组里面的Facades类设置别名        AliasLoader::getInstance(array_merge(            $app->make('config')->get('app.aliases', []),            $app->make(PackageManifest::class)->aliases()        ))->register();    }

Illuminate/Foundation/AliasLoader.php

public function load($alias)    {        if (static::$facadeNamespace && strpos($alias, static::$facadeNamespace) === 0) {            $this->loadFacade($alias);            return true;        }      // $alias来自于config/app.php中aliases数组         if (isset($this->aliases[$alias])) {            //'Route' => Illuminate\\Support\\Facades\\Route::class,            // class_alias 为一个类创建别名            return class_alias($this->aliases[$alias], $alias);        }    }

Illuminate/Support/Facades/Cache.php

class Cache extends Facade{    /**     * Get the registered name of the component.     *     * @return string     */    protected static function getFacadeAccessor()    {        return 'cache';    }}

Illuminate/Support/Facades/Facade.php

这个文件没有get set ,只有__callStatic

public static function __callStatic($method, $args)    {        $instance = static::getFacadeRoot();        if (! $instance) {            throw new RuntimeException('A facade root has not been set.');        }        return $instance->$method(...$args);    }   public static function getFacadeRoot()    {        return static::resolveFacadeInstance(static::getFacadeAccessor());    }      protected static function resolveFacadeInstance($name)    {    //这里$name为cache        if (is_object($name)) {            return $name;        }        if (isset(static::$resolvedInstance[$name])) {            return static::$resolvedInstance[$name];        }    //$app是容器对象,实现了ArrayAccess接口,最终调用的还是容器的make方法        return static::$resolvedInstance[$name] = static::$app[$name];    }

IlluminateContainerContainer.php

public function make($abstract, array $parameters = [])    {        return $this->resolve($abstract, $parameters);    }    protected function resolve($abstract, $parameters = [])    {        $abstract = $this->getAlias($abstract);        $needsContextualBuild = ! empty($parameters) || ! is_null(            $this->getContextualConcrete($abstract)        );        // If an instance of the type is currently being managed as a singleton we'll        // just return an existing instance instead of instantiating new instances        // so the developer can keep using the same objects instance every time.        if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {            return $this->instances[$abstract];        }        $this->with[] = $parameters;        $concrete = $this->getConcrete($abstract);        // We're ready to instantiate an instance of the concrete type registered for        // the binding. This will instantiate the types, as well as resolve any of        // its "nested" dependencies recursively until all have gotten resolved.        if ($this->isBuildable($concrete, $abstract)) {            $object = $this->build($concrete);        } else {            $object = $this->make($concrete);        }        // If we defined any extenders for this type, we'll need to spin through them        // and apply them to the object being built. This allows for the extension        // of services, such as changing configuration or decorating the object.        foreach ($this->getExtenders($abstract) as $extender) {            $object = $extender($object, $this);        }        // If the requested type is registered as a singleton we'll want to cache off        // the instances in "memory" so we can return it later without creating an        // entirely new instance of an object on each subsequent request for it.        if ($this->isShared($abstract) && ! $needsContextualBuild) {            $this->instances[$abstract] = $object;        }        $this->fireResolvingCallbacks($abstract, $object);        // Before returning, we will also set the resolved flag to "true" and pop off        // the parameter overrides for this build. After those two things are done        // we will be ready to return back the fully constructed class instance.        $this->resolved[$abstract] = true;        array_pop($this->with);        return $object;    }

Illuminate/Cache/CacheServiceProvider.php

 public function register()    {        $this->app->singleton('cache', function ($app) {            return new CacheManager($app);        });        $this->app->singleton('cache.store', function ($app) {            return $app['cache']->driver();        });        $this->app->singleton('memcached.connector', function () {            return new MemcachedConnector;        });    }

get set

$instance->$method(...$args)

laravel 中 Facades的原理以及代码剖析。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 laravel cache get是怎么调用的? https://www.jike1995.com/35847.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务