【问题标题】:symfony2 configure service with data from another servicesymfony2 使用来自另一个服务的数据配置服务
【发布时间】:2013-05-13 14:45:07
【问题描述】:

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

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

a2lix_translation_form:
    locales: [en, fr, nl]

此配置通常通过捆绑配置以构造函数参数或设置器的形式映射到服务。例如:

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

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

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

【问题讨论】:

    标签: symfony configuration dependency-injection


    【解决方案1】:

    我会使用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 中提供的应用程序的默认语言环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多