Facades外观模式背后实现原理

未匹配的标注

外观模式Facade理解

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


UserFacade::login(); 

Facade工作原理

  1. Facade 核心实现原理就是在 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用法

Laravel 为什么要定义 Facades,它有什么好处?

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

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

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

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

示例代码下载链接

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
cxp1539
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:1
讨论数量: 0
发起讨论 查看所有版本


暂无话题~