搜尋

首頁  >  問答  >  主體

laravel的「門面」與「契約」的問題

laravel的「門面」和「契約」的問題:
問題有兩個:
1、這兩個東西的使用場景是什麼?
2、我理解不了為什麼要使用這兩個詞,感覺八竿子打不著,這兩個詞跟它們的功能有什麼關聯嗎?

过去多啦不再A梦过去多啦不再A梦2748 天前467

全部回覆(3)我來回復

  • 给我你的怀抱

    给我你的怀抱2017-05-16 16:49:41

    簡單的說:
    外觀(你說的門面)是外觀模式的實作。 外观(你说的门面)是外观模式的实现。
    协议(你说的契约)是工厂方法模式抽象工厂模式協定(你說的契約)是工廠方法模式抽象工廠模式的實作。

    閱讀一下設計模式,你能收貨不少。

    回覆
    0
  • 高洛峰

    高洛峰2017-05-16 16:49:41

    你要先學會用依賴注入容器。

    Laravel的Facade就是從容器呼叫服務的捷徑。

    沒有Facade的時候,你可能要這樣拿到一個服務/對象,然後呼叫:

    $service = App::make('some_service');
    $service->doSomething();

    因為你在容器裡註冊了'some_service',所以容器能make一個實例給你。

    Facade只是用靜態方式簡化了這個使用過程,底層用__callStatic把函數和參數傳給服務實例:

    class SomeService extends Facade
    {
        protected static function getFacadeAccessor()
        {
            return 'some_service'; // 这是容器里的键
        }
    }
    
    SomeService::doSomething(); // 底层和第一段代码是类似的

    Contract就是一堆框架自帶的接口,可以透過依賴注入來具體實現。

    public function index(SomeService $service) { // 等服务容器注入一个SomeService。
        $service->doSomething();
    }

    Facade和Contract只是依賴注入容器的不同使用方式,用Facade就是自己去容器取(把容器當Service Locator用),用Contract就是等容器注入依賴。

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 16:49:41

    門面,往簡單了說,就是為服務容器中綁定的服務起了個別名,利用class_alias函數
    比如App對應Container類別。

    契約,顧名思義,就是一種規定,雙方都認可並且遵守的東西,而“接口”也是具備這些特性,樓主問的,應該“面向接口編程”,面向接口編程,比較難說明白,本人資歷尚淺,需樓主自己多實踐,多體會,見諒…

    回覆
    0
  • 取消回覆