laravel什麼時候要把寫的東西放到服務提供者裡面去?
黄舟
黄舟 2017-05-16 16:47:48
0
3
372

例如我在APP目錄下新建了一個目錄Services,裡面放了一個發送郵件的服務EmailService.php,我要在其他控制器中呼叫的時候,我可以直接引用:

use App\Services\EmailService;

這樣就可以正常使用了。

那麼問題來了:
1、像上面那樣已經可以正常使用,那什麼情況下要把這個服務放到服務提供者裡面去?
2、服務提供者服務容器之間的關係一直搞不太清楚,究竟服務是放到服務容器裡面還是服務提供者裡面? 服務提供者服務容器他們各自的職責是什麼?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(3)
習慣沉默

服务提供者服务放进服务容器

補個依賴注入容器的介紹:Learn to Stop Wiring and Love Laravel's Container

洪涛

題主會問這個問題,我猜題主對於依賴注入和laravel的服務容器還有所不了解。 (當然我也不是非常了解,下面只是我比較淺顯的理解)

如果你直接在你的控制器內部指定某個命名空間下的類別(這個類別應該是是一個介面(契約)的實作),那麼這個類別就和這個控制器耦合了。當你想要修改這個實作類別的時候,你就需要修改控制器,和控制器內部呼叫的方法。

如果你是在服務提供者裡面寫,一是可以解耦合(控制器方法的參數透過型別提示的方式把服務實現類別注入進去),二是如果這個服務還依賴了別的服務,laravel的服務容器會自動處理這些依賴關係。而不是你自己在控制器前面用一堆use語法把這些依賴庫導入進來。三是透過介面約束了這個服務只提供他應該提供的方法(職責單一)。

一點淺薄理解,如有錯歡迎在留言區指出。

我想大声告诉你

服務容器和服務提供者是兩個東西,沒有任何強制關聯,所以,以下我把他們分開來講。

服務容器:
是一個全域關聯數組變量,把東西存在裡面,然後在任何地方可以憑名字取出這個物件。

服務提供者:
每一個服務提供者裡面,都有一段整個程式都會使用到的初始化程式碼,例如

在應用初始化時載入路由定義
註冊某類觀察者
連接資料庫並將db實例存放到服務容器

從上面例子我們可以看出,這些初始化程式碼,我們總是要寫的。只是laravel定義為一個規範了,強行讓你給初始化程式碼分類存放。 (你還是可以把不同型別的初始化程式碼全塞在app/Providers/AppServiceProvider.php

敬請指正。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板