Как определить динамическую конфигурацию с помощью TreeBuilder?

Я хочу настроить пакет, чтобы разрешить разные действия для разных компаний. Структура конфигурации внутри них будет одинаковой.

Мой config.yml должен выглядеть так:

 bunde_namespace: company: company_1: foo: bar baz: poit company_2: foo: bar baz: poit company_3: ... 

Когда я получаю доступ к $config я ожидаю, что массив будет выглядеть примерно так:

 $config['company'] = [ 'company_one' => [ 'foo' => 'bar' 'baz' => 'poit' ], 'company_two' => [ 'foo' => 'bar' 'baz' => 'poit' ], ... ]; 

Тем не менее, у меня нет опыта работы с TreeBuilder и настройки конфигурации, как описано в документах, и это все еще ускользает от того, как я настраиваю свою конфигурацию так, чтобы она относилась к дочерним company как к массивам с ключами.

До сих пор я достиг настройки конфигурации для одной компании:

 class Configuration implements ConfigurationInterface { /** * {@inheritdoc} */ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('dreamlines_booking_service_fibos'); $rootNode ->children() ->arrayNode('company') ->children() ->scalarNode('foo')->end() ->scalarNode('baz')->end() ->end() ->end() ->end(); return $treeBuilder; } } 

И упрощенная config.yml будет выглядеть так:

 bundle_namespace: company: foo: bar baz: poit 

Но этого я не хочу.

Я предполагаю, что мне нужно использовать useAttributeAsKey но у меня проблемы с его работой.

Это не удается:

  $rootNode ->children() ->arrayNode('company') ->prototype('array') ->useAttributeAsKey('name') ->children() ->scalarNode('foo')->end() ->scalarNode('baz')->end() ->end() ->end() ->end() ->end(); 

заявив:

[Symfony \ Component \ Config \ Definition \ Exception \ InvalidDefinitionException] -> useAttributeAsKey () не применим к конкретным узлам в пути "bundle_namespace."

Где я иду не так?

Solutions Collecting From Web of "Как определить динамическую конфигурацию с помощью TreeBuilder?"

Ошибка, useAttributeAsKey при попытке применить useAttributeAsKey к прототипу, но поскольку этот метод является частью ArrayNodeDefinition , его необходимо добавить сразу после ->arrayNode(...) . Попробуйте это, и ошибка исчезнет.

Теперь, если я правильно понял ваш вопрос, следующим выходом будет тот, на который вы нацелились:

 Array ( [company] => Array ( [company_1] => Array ( [foo] => bar [baz] => baz ) [company_2] => Array ( [foo] => bar [baz] => baz ) ) ) 

которую вы можете достичь со следующей структурой:

 $rootNode ->children() ->arrayNode('company') ->prototype('array') ->children() ->scalarNode('foo')->end() ->scalarNode('baz')->end() ->end() ->end() ->end() ->end() ; 

загруженная конфигурация:

 app: company: company_1: foo: bar baz: baz company_2: foo: bar baz: baz 

Пожалуйста, добавьте комментарий, если я неправильно понял ваш вопрос.