搜尋

首頁  >  問答  >  主體

laravel什麼時候要把寫的東西放到服務提供者裡面去?

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

use App\Services\EmailService;

這樣就可以正常使用了。

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

黄舟黄舟2755 天前376

全部回覆(3)我來回復

  • 習慣沉默

    習慣沉默2017-05-16 16:49:48

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

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 16:49:48

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

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

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

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

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-16 16:49:48

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

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

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

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

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

    敬請指正。

    回覆
    0
  • 取消回覆