關於laravel有很多很棒設計,我一直不太明白,Facade和ServiceProvider的應用情境
我一般建立一個Services目錄,裡面寫上UsersService,ArticleService,
然後在controller中,直接進行依賴注入,即可實現了UsersService的操作
希望大神能講解下,什麼樣的情境下適用Facade和ServiceProvider
回複內容:
關於laravel有很多很棒設計,我一直不太明白,Facade和ServiceProvider的應用情境
我一般建立一個Services目錄,裡面寫上UsersService,ArticleService,
然後在controller中,直接進行依賴注入,即可實現了UsersService的操作
希望大神能講解下,什麼樣的情境下適用Facade和ServiceProvider
Laravel
架構的其中一條核心思想是讓開發人員愉快的開發
,所以它的介面做的非常友好,Facade只是一個捷徑而已,所有的Facade介面都可以通過依賴注入的方式擷取,完全根據開發人員的喜好來選擇,所以沒有什麼情境適合用Facade這一說
。
Laravel
架構的另一條思想是同一件事情,可以有多種做法
,舉例如下:
/** 調用Request服務 */public function (\Illuminate\Http\Request $request) { /** 三種方式等價 */ $inputs = $request->all(); // 依賴注入(DI) $inputs = \Request::all(); // Facade $inputs= = request()->all(); // 助手方法(helper method)}
至於服務提供器Service Provider
什麼時候使用,簡單解釋如下:
如果你的服務(Services
)不依賴於其他服務,則不需要服務提供器(Service Provider
),你只需通過依賴注入該服務,Laravel的IoC容器會通過PHP的反射服務來執行個體化該服務。
反而,如果你的服務需要注入其他依賴服務,或者你的服務需要在使用前進行一些初始化的操作(bootstrap
),那麼這個時候,你就需要在服務提供器(Service Provider
)的register
方法內將服務綁定到Laravel的IoC容器內,進而在boot
方法內,進行初始化操作(bootstrap
),這個時候,程式所有的服務都登入完畢,所以初始化的過程中,還可以調用其他服務。
Laravel
內建就有很多優秀的結合使用ServiceProvider
和Facade
的例子。
比如緩衝類,通過ServiceProvider
可以很好的做到緩衝對象的配置和延遲(可能Laravel
中的寫法還是有些簡單,但是應用到複雜的系統下會越顯得ServiceProvider
比直接註冊匿名函數來延載的清晰效果)。Facade
則可以接入緩衝對象,通過容器讓操作緩衝變得更加容易,舉個例子,普通操作緩衝時需要從容器中先拉出共用的緩衝對象,操作這個對象,而通過Facade
,這些操作都已經被封裝,直接一行語句就能完成。
再應用到真實環境中,比如我們在程式中需要一個檔案儲存體操作,那麼我們寫出StorageServiceProvider
和StorageFacade
,其中Storage
中的操作都已經抽象化,我們可以在程式中直接使用StorageFacade
來調用這些抽象方法,編寫很簡潔。在StorageServiceProvider
中,我們又可以根據不同換運行環境執行個體化不同的Storage
類(比如在SAE
、BAE
上我們需要接入他們的檔案儲存體,而在我們獨立的伺服器上又需要直接寫入硬碟)。通過這樣,我們就實現了輕易切換環境,而不改動代碼。