【问题标题】:Symfony2 bundle configuration parametersSymfony2 包配置参数
【发布时间】:2012-12-23 12:59:25
【问题描述】:

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

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

这是我之前可以做的:

(...)
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 的人来配置 - 所以她必须能够打开我们的包配置文件并调整参数,然后这些参数将用于我们使用的一些 Symfony 包.所以我希望 all 应用程序配置可以在我们的包的语义配置中访问,因为我不想将整个配置暴露给那个人(我已经将所有内容分成单独的配置文件,其中之一它们包含我们包的配置,其余的 - 用于所有其他的)。

那么,我要问的可能吗?

【问题讨论】:

  • 捆绑包不能共享配置值。如果你想要这个,你需要修改配置的工作方式。我建议的方法是在其中有一个带有parameters 的文件,然后在需要它们的“真实”配置文件中使用这些值。

标签: symfony configuration dependency-injection


【解决方案1】:

由于要在每次安装中修改参数(它们可能至少在开发和生产环境之间有所不同),因此(正如 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%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2015-09-18
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多