例如我在APP目錄下新建了一個目錄Services,裡面放了一個發送郵件的服務EmailService.php,我要在其他控制器中呼叫的時候,我可以直接引用:
use App\Services\EmailService;
這樣就可以正常使用了。
那麼問題來了:
1、像上面那樣已經可以正常使用,那什麼情況下要把這個服務
放到服務提供者
裡面去?
2、服務提供者
、服務容器
之間的關係一直搞不太清楚,究竟服務
是放到服務容器
裡面還是服務提供者
裡面? 服務提供者
和服務容器
他們各自的職責是什麼?
在
服务提供者
把服务
放进服务容器
。補個依賴注入容器的介紹:Learn to Stop Wiring and Love Laravel's Container
題主會問這個問題,我猜題主對於依賴注入和laravel的服務容器還有所不了解。 (當然我也不是非常了解,下面只是我比較淺顯的理解)
如果你直接在你的控制器內部指定某個命名空間下的類別(這個類別應該是是一個介面(契約)的實作),那麼這個類別就和這個控制器耦合了。當你想要修改這個實作類別的時候,你就需要修改控制器,和控制器內部呼叫的方法。
如果你是在服務提供者裡面寫,一是可以解耦合(控制器方法的參數透過型別提示的方式把服務實現類別注入進去),二是如果這個服務還依賴了別的服務,laravel的服務容器會自動處理這些依賴關係。而不是你自己在控制器前面用一堆use語法把這些依賴庫導入進來。三是透過介面約束了這個服務只提供他應該提供的方法(職責單一)。
一點淺薄理解,如有錯歡迎在留言區指出。
服務容器和服務提供者是兩個東西,沒有任何強制關聯,所以,以下我把他們分開來講。
服務容器:
是一個全域關聯數組變量,把東西存在裡面,然後在任何地方可以憑名字取出這個物件。
服務提供者:
每一個服務提供者裡面,都有一段整個程式都會使用到的初始化程式碼,例如
從上面例子我們可以看出,這些初始化程式碼,我們總是要寫的。只是laravel定義為一個規範了,強行讓你給初始化程式碼分類存放。 (你還是可以把不同型別的初始化程式碼全塞在
app/Providers/AppServiceProvider.php
)敬請指正。