Как расширить конфиг разных пакетов в Symfony2? - PullRequest
6 голосов
/ 13 октября 2011

Я знаю, что могу перезаписывать шаблоны или расширять классы других пакетов.Но можно ли расширить и конфиги?Я надеялся, что смогу загрузить другие пространства имен из конфигурации в методе загрузки DependenyInjection/AcmeExtension.php, но я нигде ничего не нашел об этом.

Пример:

У меня есть AcmeBundle, который определяет следующее в конфигурации:

acme:
    a: 1

Я хочу расширить этот пакет (в новый пакет с именем AwesomeAcmeBundle) и иметь возможность определять другие переменные, либо добавляя их в исходное пространство имен:

acme:
    a: 1
    b: 2

или обернув исходное пространство имен в новое и добавив туда новые переменные:

awesome_acme:
    a: 1
    b: 2

Ответы [ 3 ]

2 голосов
/ 19 марта 2013

У меня были аналогичные потребности, и я решил их следующим образом:

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 голос
/ 16 мая 2012
imports:
 - { resource: @YourBundle/Resources/config/services.yml }
1 голос
/ 14 октября 2011

Если вы говорите о .yml s, вы можете импортировать AcmeBundle s confing в AwesomeAcmeBundle config с

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

и затем перезаписать нужные параметры.

Symfony делает то же самое в config_dev.yml с параметром framework/router.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...