Я хочу настроить пакет, чтобы разрешить разные действия для разных компаний. Структура конфигурации внутри них будет одинаковой.
Мой 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."
Где я иду не так?
Ошибка, 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
Пожалуйста, добавьте комментарий, если я неправильно понял ваш вопрос.