Laravel Facade

Facade是容器中的类的静态代理,可以调用容器中任何对象的任何方法。

Route::get(‘/cache’, function(){

        return Cache::get(‘key’);

});

要使用Facade,首先需要继承‘Illuminate\Support\Facades\Facade’类并且实现一个抽象方法‘getFacadeAccessor’。

use Illuminate\Support\Facades\Facade;

class Cache extends

Facade

{

    /**

    *获取组件注册名称

    *

    * @return string

    */

    protected static function getFacadeAccessor() {

        return 'cache';

    }

}

‘getFacadeAccessor’ 这个方法只要返回一个容器绑定类的名字即可,当然也可以直接返回一个类如:

use

Illuminate\Support\Facades\Facade;

use Cache;

class Cache extends

Facade

{

    /**

    *获取组件注册名称

    *

    * @return string

    */

    protected static function getFacadeAccessor() {

        return new Cache;

    }

}

Facade的核心是使用了‘__callStatic’这个魔术方法,使用了这个方法之后,即可直接调用Cache中的get方法,尽管这个方法在Cache类中并不存在。

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);    //调用方法

}

然后以下的在Facade中的方法可以从容器中解析出对象:

public static function getFacadeRoot(){

    return static::resolveFacadeInstance(static::getFacadeAccessor());

}

protected static function getFacadeAccessor(){

    throw new RuntimeException('Facade does not implement getFacadeAccessor

    method.');

}

protected static function resolveFacadeInstance($name){

    if (is_object($name)) {

        return $name;

    }

    if (isset(static::$resolvedInstance[$name])) { 

        return static::$resolvedInstance[$name];

    }

    return static::$resolvedInstance[$name] = static::$app[$name];

}

其中的'getFacadeAccessor'这个方法必须被重写,否者就会抛出异常。然后在'resolveFacadeInstance'这个方法中会先判断是否是一个对象,如果是的话就直接返回。所以上文说的'getFacadeAccessor'这个方法直接返回一个对象也是可以的,奥秘就在这。

然后会去判断需要解析的对象是否已经解析过了,如果解析过了就直接返回,否则会从容器中去解析再返回,这样不仅仅实现了单例,而且还可以提升性能。

得到对象后,就是直接通过对象来调用方法了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一袭红衣醉卧榻上,半眯着的眼,手边一壶酒将倾玉泽。半边的金黄面具映着红光照着绰绰约约的歌舞人影。 "今日何处消愁,...
    也去阅读 505评论 0 17
  • 回家过完年,离家去上班。 辞别多踌躇,游子苦难言。
    蛮力阅读 367评论 3 10
  • 我这个厨房杀手,一直以来是不敢涉足烘焙届的,一看到各种器具、各种原材料,还有五花八门的种类,天啊,我的智商瞬间透支...
    史文文阅读 269评论 0 0
  • 日子流水似的滑过,转眼三年过去了。新月从15岁的毛丫头长成18岁的俏闺女,越发出落得水灵动人。那肉皮子越发白嫩,就...
    行走的大蘑菇阅读 311评论 2 9
  • 我们在秋天邂逅, 高高的蓝天上没有云, 金黄的树叶就落在脚边。 我看着你,你看着我, 我们不必说话, 风的语言从你...
    三水林枫阅读 196评论 0 1