2012-12-23 35 views
2

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

问题是我现在无法将我们的bundle参数导入到另一个bundle config。

这是我能做什么之前:

(...) 
parameters: 
    company.bundle.email.user: [email protected] 
    company.bundle.email.pass: @MyBeAUtiFULpA55w0Rd! 
(...) 

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

这里就是我想现在要做的,并没有在所有的工作:

(...) 
company_bundle: 
    (...) 
    settings: 
     (...) 
     mailer: 
      (...) 
      user: [email protected] 
      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包中使用它我们用。所以我想所有的应用程序配置都可以在我们的bundle的语义conf中访问,因为我不想把整个配置公开给那个人(我已经把所有的东西都分成了单独的配置文件,其中一个包含配置我们的捆绑包,其他 - 所有其他的)。

那么,我问的是甚至可能吗?

+0

软件包不能共享配置值。如果你想这样做,你需要修改配置的工作方式。我建议的方式是在那里有一个带'parameters'的单个文件,然后在你需要它们的“真实”配置文件中使用这些值。 – Sgoettschkes

回答

0

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

在Symfony2默认情况下,这些参数的位置是parameters.yml位于app/config/dir中的文件。

在标准安装,你可以找到例如这样的条目:

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

这些PARAMS在配置使用。阳明这样说:

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

所以,你可以定义你PARAMS(在parameters.yml):

parameters: 
    (...) 
    company_bundle_email_user: [email protected] 
    company_bundle_email_pass: @MyBeAUtiFULpA55w0Rd! 

,并用它们(在config.yml):

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