容器建置工作流程
與依賴注入元件相關的檔案和類別位置取決於您想要使用容器的應用程式、函式庫或框架。 了解 Symfony 完整堆疊框架中容器的組態和建置方式,將有助於您了解這一切如何結合在一起,無論您是使用完整堆疊框架還是希望在另一個應用程式中使用服務容器。
完整堆疊框架使用 HttpKernel 元件來管理從應用程式和套件載入服務容器組態,並處理編譯和快取。 即使您未使用 HttpKernel,它也應該讓您了解在模組化應用程式中組織組態的一種方式。
使用快取容器
在建置之前,核心會檢查快取版本的容器是否存在。 核心具有偵錯設定,如果為 false,則會使用快取版本(如果存在)。 如果偵錯為 true,則核心會檢查組態是否為最新,如果是,則會使用快取版本的容器。 否則,容器會從應用程式層級組態和套件的擴充套件組態建置。
閱讀〈傾印組態以提升效能〉以了解更多詳細資訊。
應用程式層級組態
應用程式層級組態從 config
目錄載入。 載入多個檔案,然後在處理擴充套件時合併。 這允許針對不同的環境(例如 dev、prod)進行不同的組態。
這些檔案包含參數和服務,這些參數和服務會依照〈使用組態檔設定容器〉直接載入到容器中。 它們也包含由擴充套件處理的組態,如〈使用擴充套件管理組態〉所示。 這些被視為套件組態,因為每個套件都包含一個 Extension 類別。
使用擴充套件的套件層級組態
依照慣例,每個套件都包含一個 Extension 類別,該類別位於套件的 DependencyInjection
目錄中。 這些會在核心啟動時註冊到 ContainerBuilder
。 當 ContainerBuilder
被編譯時,與套件擴充套件相關的應用程式層級組態會傳遞給 Extension,Extension 通常也會載入自己的組態檔,通常從套件的 Resources/config
目錄載入。 應用程式層級組態通常會使用 Configuration 物件進行處理,該物件也儲存在套件的 DependencyInjection
目錄中。
允許套件之間互動的編譯器 Pass
編譯器 Pass 用於允許不同套件之間的互動,因為它們無法影響擴充套件類別中彼此的組態。 主要用途之一是處理標籤服務,允許套件註冊服務以供其他套件擷取,例如 Monolog 記錄器、Twig 擴充套件和 Web Profiler 的資料收集器。 編譯器 Pass 通常放置在套件的 DependencyInjection/Compiler
目錄中。
編譯和快取
在編譯程序從組態、擴充套件和編譯器 Pass 載入服務後,會傾印它,以便下次可以使用快取。 然後,在後續請求期間使用傾印的版本,因為它更有效率。