symfony2使用来自其他服务的数据配置服务

时间:2013-05-13 14:45:07

标签: symfony configuration dependency-injection

Symfony2是否可以通过从其他服务注入数据来配置服务?例如,通过在另一个服务上调用getter?

在我的具体情况下,我正在创建一个可以处理可翻译实体字段的(可重用)服务。为此,我需要应用程序中的可用语言环境列表。我已经查看了一些其他可以与locales一起使用的bundle,但是他们总是使用配置中的静态数组。例如:

a2lix_translation_form:
    locales: [en, fr, nl]

此配置通常最终通过bundle配置以构造函数参数或setter的形式映射到服务。例如:

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

但在我看来,可用语言环境列表并不总是静态的,通常来自数据库。我在我的应用程序中使用方法Locale创建了一个getLocales服务,该方法返回一个数组。但是如何将该阵列放入需要它的服务中呢?

我正在创建的需要区域设置列表的服务被拆分为一个单独的可重用软件包。我不想直接注入Locale服务,因为该服务特定于应用程序,而不是我正在创建的包。我希望我的捆绑包的用户能够提供静态的区域设置列表,或者指向具有所有区域设置的服务。

1 个答案:

答案 0 :(得分: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

此外,在您的捆绑包中的/ DependencyInjection中的MyBundleExtension.php中,您可以访问服务容器并将参数locale传递给您的默认服务,以便它使用parameters.yml中提供的应用程序的默认语言环境。