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拿到一個實例對象,再進行調用。

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