Symfony2捆绑配置参数

时间:2012-12-23 12:59:26

标签: symfony configuration dependency-injection

我的团队开发了一个非常大的电子商务项目。到目前为止,我们在该捆绑包中有40个配置参数,我不知道它们的最终关系,也没有办法正确地构造它们,所以我们最终使用app/config.yml文件中的标准参数结构。 但是,在我决定将配置移动到语义配置结构的某个地方 - 所以我可以验证它,拥有一个干净的结构,通过bundle继承等方便地扩展它。

问题是我现在无法将我们的捆绑包参数导入另一个捆绑包配置。

以下是我之前可以做的事情:

(...)
parameters:
    company.bundle.email.user: user@domain.com
    company.bundle.email.pass: @MyBeAUtiFULpA55w0Rd!
(...)

swiftmailer:
    (...)
    username: %company.bundle.email.user%
    password: %company.bundle.email.pass%

以下是我现在要做的事情,但根本不起作用:

(...)
company_bundle:
    (...)
    settings:
        (...)
        mailer:
            (...)
            user: user@domain.com
            pass: @MyBeAUtiFULpA55w0Rd!
 (...)

 swiftmailer:
     (...)
     username: %company_bundle.settings.mailer.user%
     password: %company_bundle.settings.mailer.pass%

 (...)

当然company_bundle节点包含语义配置,由DIC处理并在Company\Bundle\DependencyInjection\Configuration.php中定义。

我现在所有的结果都是以下错误:

[Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException]                       
You have requested a non-existent parameter "company_bundle.settings.mailer.user".

所以问题是:如何在另一个捆绑配置参数中访问我的捆绑参数(我已经在Swiftmailer捆绑包之前已经处理了包括我的捆绑配置总是)?

注意:此处显示的Swiftmailer软件包配置仅用于演示目的,我希望能够在其他一些软件包中重用我的软件包参数。

背后的动机是什么?

我希望我的产品能够由一个不熟悉Symfony的人配置 - 所以她必须能够打开我们的bundle配置文件并调整参数,然后在我们使用的一些Symfony包中使用它们。所以我希望所有应用程序配置都可以在我们的bundle的语义配置中访问,因为我不希望将整个配置公开给那个人(我已经将所有配置分成了单独的配置文件,其中一个它们包含我们捆绑的配置,其余的 - 包括所有其他的配置。)

那么,我甚至可能会问这个问题吗?

1 个答案:

答案 0 :(得分:0)

由于要在每个安装中修改参数(它们可能至少在开发和生产环境之间有所不同),因此(如Sgoettschkes在评论中所述)外部文件是最佳解决方案。

在Symfony2中,此类参数的默认位置是位于app / config / dir中的 parameters.yml 文件。

在标准安装中,您可以找到例如此类条目:

parameters:
    database_driver: pdo_mysql
    database_host: 127.0.0.1
    (...)

这些参数在config.yml中以这种方式使用:

doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        (...)

所以你可以定义你的参数(在 parameters.yml 中):

parameters:
    (...)
    company_bundle_email_user: user@domain.com
    company_bundle_email_pass: @MyBeAUtiFULpA55w0Rd!

并使用它们(在 config.yml 中):

swiftmailer:
    (...)
    username: %company_bundle_email_user%
    password: %company_bundle_email_pass%