跳到內容

如何匯入設定檔/資源

編輯此頁

提示

在本節中,服務設定檔被稱為資源。雖然大多數設定資源是檔案(例如 YAML、XML、PHP),但 Symfony 能夠從任何地方載入設定(例如資料庫,甚至是透過外部網路服務)。

服務容器是使用單一設定資源(預設為 config/services.yaml)建置的。這讓您可以完全彈性地控制應用程式中的服務。

外部服務設定可以透過兩種不同的方式匯入。第一種方法,通常用於匯入其他資源,是透過 imports 指令。第二種方法,使用依賴注入擴充功能,由第三方套件用於載入設定。請繼續閱讀以瞭解有關這兩種方法的更多資訊。

使用 imports 匯入設定

預設情況下,服務設定位於 config/services.yaml 中。但是,如果該檔案變得很大,您可以自由地將其組織到多個檔案中。假設您決定將一些設定移至新檔案

1
2
3
4
5
6
# config/services/mailer.yaml
parameters:
    # ... some parameters

services:
    # ... some services

若要匯入此檔案,請使用任何其他檔案中的 imports 鍵,並傳遞匯入檔案的相對或絕對路徑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/services.yaml
imports:
    - { resource: services/mailer.yaml }
    # If you want to import a whole directory:
    - { resource: services/ }
services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # ...

在載入設定檔時,Symfony 會先載入匯入的檔案,然後處理檔案中定義的參數和服務。如果您使用如上述範例中的 預設 services.yaml 設定,則 App\ 定義會為在 ../src/* 中找到的類別建立服務。如果您的匯入檔案也為這些類別定義了服務,它們將被覆寫。

針對此問題,一個可能的解決方案是在 App\ 定義的 exclude 選項中新增匯入檔案的類別和/或目錄。另一個解決方案是不使用 imports,而是在同一個檔案中,但在 App\ 定義之後新增服務定義以覆寫它。

注意

由於參數解析的方式,您無法使用它們來動態建構 imports 中的路徑。這表示以下操作無效:

1
2
3
# config/services.yaml
imports:
    - { resource: '%kernel.project_dir%/somefile.yaml' }

透過容器擴充功能匯入設定

第三方套件容器設定,包括 Symfony 核心服務,通常使用另一種方法載入:容器擴充功能

在內部,每個套件都會像您目前所看到的這樣在檔案中定義其服務。但是,這些檔案不會使用 import 指令匯入。相反地,套件使用依賴注入擴充功能來自動載入檔案。一旦您啟用套件,就會呼叫其擴充功能,該擴充功能能夠載入服務設定檔。

實際上,config/packages/ 中的每個設定檔都會傳遞到其相關套件的擴充功能(例如 FrameworkBundleTwigBundle),並用於進一步設定這些服務。

本作品及其程式碼範例以 Creative Commons BY-SA 3.0 授權條款發佈。
目錄
    版本