• 技术文章 >php框架 >Laravel

    laravel cache get是怎么调用的?

    藏色散人藏色散人2021-05-10 08:55:17转载132
    下面由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的原理以及代码剖析。

    以上就是laravel cache get是怎么调用的?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:php php7 laravel
    上一篇:分享一个Laravel建议写法指南 下一篇:介绍Laravel自定义Make命令生成Service类
    第16期线上培训班

    相关文章推荐

    • 关于 Laravel Hprose RPC 服务• 解析laravel使用workerman用户交互、服务器交互• 你知道为什么Laravel会重复执行同一个队列任务吗?• 搞搞laravel里api路由的auth:api和api_token• 分享一个Laravel建议写法指南

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网