Facades 外观模式背后实现原理

外观模式Facade理解

上一节我们讲到需要$ioc->make('user')才能拿到User的实例,再去使用$user->login();那能不能更方便点,比如下面的用法,是不是很方便。


UserFacade::login(); 

Facade工作原理

  1. Facede 核心实现原理就是在UserFacade提前注入IoC容器。
  2. 定义一个服务提供者的外观类,在该类定义一个类的变量,跟ioc容器绑定的key一样,
  3. 通过静态魔术方法__callStatic可以得到当前想要调用的login
  4. 使用static::$ioc->make('user');

具体实现Facade

1.我们定义一个User的外观类UserFacade


class UserFacade
{
    // 维护Ioc容器
    protected static $ioc;

    public static function setFacadeIoc($ioc)
    {
        static::$ioc = $ioc;
    }

    // 返回User在Ioc中的bind的key
    protected static function getFacadeAccessor()
    {
        return 'user';
    }

    // php 魔术方法,当静态方法被调用时会被触发
    public static function __callStatic($method, $args)
    {
        $instance = static::$ioc->make(static::getFacadeAccessor());
        return $instance->$method(...$args);
    }

}

//实例化IoC容器

$ioc = new Ioc();
$ioc->bind('log','FileLog');
$ioc->bind('user','User');

UserFacade::setFacadeIoc($ioc);

UserFacade::login();

如果有对__callStatic魔术方法不太明白的,可以查看php文档

__callstatic用法

为什么要使用Facades

有的同学说,使用Facede那不是更加麻烦了啊,还需要注入ioc容器,还得需要用魔术方法。

其实laravel在框架运行的时候这些步骤都帮我们自动加好了,我们只需要使用UserFacade::login();就可以了。

使用Facades其实最主要的就是它提供了简单,易记的语法,从而无需手动注入或配置长长的类名。此外,由于他们对 PHP 静态方法的独特调用,使得测试起来非常容易。

好了我们这个章节的内容就到这里。

示例代码下载链接

cxp1539 has written 16 articles

该作者很低调,还没有自我介绍~

积分:641 等级:P5 职业:未设置 城市:未设置

1 条回复

  1. 张三 张三 says:

    $instance->$method(...$args); 括号里面为什么要加三个点?

登录后才能进行评论,立即登录?