【问题标题】:How to define dynamic configuration using the TreeBuilder?如何使用 TreeBuilder 定义动态配置?
【发布时间】:2016-01-22 03:39:02
【问题描述】:

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

我的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\Component\Config\Definition\Exception\InvalidDefinitionException] ->useAttributeAsKey() 不适用于路径“bundle_namespace”处的具体节点。

我哪里出错了?

【问题讨论】:

    标签: php symfony configuration


    【解决方案1】:

    你得到的错误是当你尝试在原型上应用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
    

    如果我误解了您的问题,请发表评论。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多