Laravel源码分析之Facades外观模式原理

引言

接上篇文章Laravel源码分析IOC容器提到的内容,可以使用ioc->make('user')来创建一个$user实例,在通过$user->login()来调用实例方法,但是还能不能更方便一点,直接调用通过UserFacede::login()方式直接调用呢?

Facade

外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

Facades实现原理

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

代码示例:


<?php


class UserFacades
{
    protected static $ioc;

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

    /**
     * 返回User在IOC容器中绑定的KEY
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'user';
    }

    /**
     * __callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。
     * @param $method
     * @param $arguments
     * @return mixed
     */
    public static function __callStatic($method, $arguments)
    {
        // 通过ioc容器拿到对应的实例
        $instance = static::$ioc->make(static::getFacadeAccessor());
        // 通过实例来调用指定方法
        return $instance->$method(...$arguments);
    }
}
UserFacades::login();

通过预先绑定一个ioc容器,当通过UserFacade::login()调用方法时,如果login方法不存在,则会调用魔术方法, 魔术方法通过预先绑定的ioc容器和预先指定的ioc容器绑定的key拿到一个实例对象,再进行调用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章