如何在Symfony2中扩展不同包的配置?

时间:2011-10-13 13:59:29

标签: php symfony

我知道我可以覆盖模板或扩展其他包的类。但我可以延长配置吗?我希望能够在DependenyInjection/AcmeExtension.php的加载方法中从config加载其他命名空间,但我在任何地方都没有找到任何关于它的信息。

示例:

我有AcmeBundle,它在config中定义了以下内容:

acme:
    a: 1

我想扩展这个包(在名为AwesomeAcmeBundle的新包中)并能够通过将它们添加到原始命名空间来定义另一个变量:

acme:
    a: 1
    b: 2

或将原始命名空间包装到新的命名空间并在其中添加新变量:

awesome_acme:
    a: 1
    b: 2

3 个答案:

答案 0 :(得分:2)

我有类似的需求,我已通过以下方式解决了这些问题:

1)扩展父级的配置类

//FooBundle\DependencyInjection\Configuration.php

use DerpBundle\DependencyInjection\Configuration as BaseConfiguration;

class Configuration extends BaseConfiguration
{

    public function getConfigTreeBuilder()
    {
        $treeBuilder = parent::getConfigTreeBuilder();

        //protected attribute access workaround
        $reflectedClass = new \ReflectionObject($treeBuilder);
        $property = $reflectedClass->getProperty("root");
        $property->setAccessible(true);

        $rootNode = $property->getValue($treeBuilder);

        $rootNode
           ->children()
           ...

        return $treeBuilder;
     }
}

2)创建实际可以处理新配置条目的自己的扩展

class FooExtension extends Extension
{

    public function load(array $configs, ContainerBuilder $container)
    {

        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        //custom parameters
        $container->setParameter('new_param_container_name', $config['new_param_name']);

     ...
     }
}

3)在app\config\config.yml您可以在新的foo属性集中使用derp(作为父包)的所有参数以及您的任何新参数已在Configuration.php中定义。

答案 1 :(得分:1)

如果您正在谈论.yml,则可以使用

导入AcmeBundle配置中的AwesomeAcmeBundle配置
imports:
    - { resource: path/to/AcmeBundles/config.yml }

然后覆盖您想要的参数。

Symfony在config_dev.yml中使用framework/router参数执行相同操作。

答案 2 :(得分:1)

imports:
 - { resource: @YourBundle/Resources/config/services.yml }