1

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

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

a2lix_translation_form:
    locales: [en, fr, nl]

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

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

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

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

4

1 回答 1

2

我会使用语义配置配置定义来解决这个问题。它的工作方式与 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 提供了一个很好的例子来说明如何做到这一点

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

于 2013-05-13T15:38:31.530 回答