Объединение значений по умолчанию узла массива конфигурации пакета Symfony - PullRequest
0 голосов
/ 21 февраля 2019

У меня проблема с конфигурацией пакета Symfony4.У меня есть класс конфигурации с:

$rootNode
        ->children()
            ->arrayNode('mapping')
                ->useAttributeAsKey('code')
                ->prototype('scalar')->end()
                ->defaultValue(['default' => 'test'])
            ->end()
            .....
        ->end();

Это возвращает конфигурацию по умолчанию, например:

array(1) {
   ["default"]=> string(4) "test"
}

Но когда я добавляю файл конфигурации:

bundle:
    mapping:
        test: newvalue
        test2: newvalue2

Imполучение конфигурации:

array(2) {
   ["test"]=> string(8) "newvalue"
   ["test2"]=> string(9) "newvalue2"
}

Но я ожидаю слияния этих двух конфигов, чтобы получить:

array(3) {
   ["default"]=> string(4) "test"
   ["test"]=> string(8) "newvalue"
   ["test2"]=> string(9) "newvalue2"
}

Как настроить объединение этих значений по умолчанию с предоставленными конфигурациями?Конечно, я хочу разрешить переопределение конфигурации «по умолчанию», но по умолчанию необходимо объединить ее.

Не могу найти какое-либо решение по документам https://symfony.com/doc/current/components/config/definition.html#array-node-options

Пожалуйста, помогите:)

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если я правильно понял, вы хотите, чтобы запись default была всегда определена.Приложения смогут перезаписать значение по умолчанию DEFAULT из default.

Хорошо, есть два решения:

Плохое решение

    $rootNode = $treeBuilder->getRootNode()
        ->children()
            ->arrayNode('mapping')
                ->useAttributeAsKey('code')
                ->prototype('scalar')->end()
                ->beforeNormalization()
                    ->ifArray()
                    ->then(function ($mapping) {
                        return $mapping + ['default' => 'DEFAULT'];
                    })
                ->end()
            ->end();

Если ключ по умолчанию не определен, он будет добавлен вместе со значением по умолчаниюDEFAULT значение.Он будет работать для проанализированного файла конфигурации ONE .НО вы получите проблему, если у вас есть два и более файла конфигурации:

# config.yml
mapping:
    some: value
    default: MY_DEVELOPMENT_DEFAULT

# prod/config.yml
mapping:
    some: value_prod

У вас будет:

['some' => 'value_prod', 'default' => 'DEFAULT']

Это неправильно.Значение по умолчанию заменяет MY_DEVELOPMENT_DEFAULT, поскольку оно было добавлено к prod/config.yml и объединено с config.yml.

К сожалению, построитель дерева не позволяет определять обратный вызов после объединения.

Хорошее решение

Вы можете добавить записи по умолчанию после слияния значений конфигурации (например, в проходах компилятора).

0 голосов
/ 21 февраля 2019

Для этого вам нужно определить конфигурацию массива глубже:

$treeBuilder
   ->children()
       ->arrayNode('mapping')
           ->ignoreExtraKeys()
           ->addDefaultsIfNotSet()
           ->children()
               ->scalarNode('default')
                   ->defaultValue('test)
               ->end()
           ->end()
       ->end()
   ->end()

addDefaultsIfNotSet добавит ваши значения по умолчанию.IgnoreExtraKeys позволяет вам определять дополнительные ключи, как в вашем примере.Было бы лучше полностью настроить ключи, потому что у вас есть лучший контроль над ними.

...