laravel的「門面」和「契約」的問題:
問題有兩個:
1、這兩個東西的使用場景是什麼?
2、我理解不了為什麼要使用這兩個詞,感覺八竿子打不著,這兩個詞跟它們的功能有什麼關聯嗎?
给我你的怀抱2017-05-16 16:49:41
簡單的說:外觀
(你說的門面
)是外觀模式
的實作。 外观
(你说的门面
)是外观模式
的实现。协议
(你说的契约
)是工厂方法模式
或抽象工厂模式
協定
(你說的契約
)是工廠方法模式
或抽象工廠模式
的實作。
閱讀一下設計模式,你能收貨不少。
高洛峰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就是等容器注入依賴。
曾经蜡笔没有小新2017-05-16 16:49:41
門面,往簡單了說,就是為服務容器中綁定的服務起了個別名,利用class_alias函數
比如App對應Container類別。
契約,顧名思義,就是一種規定,雙方都認可並且遵守的東西,而“接口”也是具備這些特性,樓主問的,應該“面向接口編程”,面向接口編程,比較難說明白,本人資歷尚淺,需樓主自己多實踐,多體會,見諒…