2013-05-13 67 views
1

Symfony2可以通過從其他服務注入數據來配置服務嗎?例如,通過在另一個服務上調用getter?symfony2使用來自其他服務的數據配置服務

在我的具體情況下,我創建了一個可以處理可翻譯實體字段的(可重用)服務。爲此,我需要應用程序中可用語言環境的列表。我已經看過一些其他可以與語言環境一起工作的包,但它們總是使用來自配置的靜態數組。例如:

a2lix_translation_form: 
    locales: [en, fr, nl] 

此配置通常以配置參數或setter的形式通過bundle配置映射到服務。例如:

class SomeService { 
    function __construct(array $locales) { ... } 
    // or 
    function setLocales(array $locales) { ... } 
} 

但在我的情況下,可用語言環境列表並不總是靜態的,通常來自數據庫。我在我的應用程序中使用返回數組的方法getLocales創建了一個Locale服務。但是,如何將該陣列放入需要它的服務中?

我正在創建的服務需要一個語言環境列表被拆分爲一個單獨的可重用包。我不想直接注入Locale服務,因爲該服務特定於應用程序,而不是我創建的包。我希望我的包的用戶能夠提供一個靜態的區域設置列表,或指向具有所有區域設置的服務。

回答

2

我會用semantic configurationconfig defintions來解決這個問題。它與FOSUserBundle如何請求驅動程序並根據您的選擇使用不同的設置(orm,mongodb,propel)非常相似。

您可以添加這樣的事情你config.yml:

a2lix_locale: 
    provider: default # database 
    # ... additional settings which are optional, 
    # but required by provider, e.g. database settings 

你包的的configuration.php將驗證有效的供應商選擇和額外的設置是根據什麼每個供應商需要設置。再次,FOSUserBundle provides a great example for how to do this

此外,在你的包的MyBundleExtension.php在/ DependencyInjection您可以訪問服務容器,並通過例如將參數locale到您的默認服務,以便它可以利用parameters.yml提供應用程序的默認語言環境。