2011-10-13 49 views
6

我知道我可以覆蓋模板或擴展其他包的類。但我可以擴展配置嗎?我希望能夠從DependenyInjection/AcmeExtension.php的加載方法中的config中加載其他命名空間,但是我沒有在任何地方找到任何關於它的信息。如何在Symfony2中擴展不同bundle的配置?

實施例:

我有限定在配置以下AcmeBundle:

acme: 
    a: 1 

我想延長此束(在稱爲AwesomeAcmeBundle新束),並能夠或者通過定義另一個變量將它們添加到原名稱空間中:

acme: 
    a: 1 
    b: 2 

或通過將原始名稱空間包裝到新的名稱空間次加入新的變量有:

awesome_acme: 
    a: 1 
    b: 2 

回答

1

如果你在談論的.yml S,你可以用

imports: 
    - { resource: path/to/AcmeBundles/config.yml } 

導入AcmeBundle小號confing在AwesomeAcmeBundle配置,然後覆蓋你想要的參數。

Symfony在config_dev.ymlframework/router參數中的做法相同。

+0

不,這不完全是我的意思。我想擴展一些bundle的配置(又名'DependencyInjection/Configuration.php'),而不僅僅是配置文件。 –

1
imports: 
- { resource: @YourBundle/Resources/config/services.yml } 
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)創建自己的擴展,其實可以處理新在app\config\config.yml配置條目

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),你可以在你的新0使用屬性 - 設置derp(作爲父包)的所有參數加上您在Configuration.php中定義的任何新參數。

+0

我不得不添加一些額外的配置到現有的包配置。在該現有捆綁包的根節點下。它不會以這種方式工作,因爲symfony不允許使用其他根名稱而不是您的軟件包名稱的下劃線版本。你知道一種真正擴展現有配置樹的方法,同時保持在同一根節點下嗎? – axelvnk