如何使用TreeBuilder定义动态配置?

时间:2015-10-22 18:28:55

标签: php symfony configuration

我想配置一个包以允许不同公司的不同行为。其中的配置结构将是相同的。

我的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和setting up the configuration as described in the docs的经验,但我仍然没有想到我如何设置配置,以便将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的\元器件\配置\定义\异常\ InvalidDefinitionException]    - > useAttributeAsKey()不适用于路径“bundle_namespace”的具体节点。

我哪里错了?

1 个答案:

答案 0 :(得分:2)

当您尝试在原型上应用# Ignore application configuration /config/application.yml 时会导致错误,但由于该方法属于ArrayNodeDefinition,因此需要在useAttributeAsKey之后添加。试试这种方式,错误就会消失。

现在,如果我正确理解了你的问题,那么你想要的输出是:

->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()
    ;

如果我误解了你的问题,请附上评论。