【问题标题】:Symfony3 tree builder generic node valueSymfony3 树生成器通用节点值
【发布时间】:2017-08-03 04:22:51
【问题描述】:

你如何定义一个你不知道整个结构的包配置?

例如,我有一个处理文件上传的包,我想使用“插槽”系统创建约束。您为您的插槽定义一个名称,以及一个相关的配置(例如添加约束),如下所示:

my_bundle:
    slots:
        avatar:
            constraints:
                image:
                    max_width: 200
        cv:
            constraints:
                 pdf: 
                     max_size: 2M
                     other_option_specific_to_pdf: [1, 2, 3]

然后捆绑包将创建约束并验证您的上传。捆绑包不知道哪些选项可以传递给约束,因此我无法在树构建器中定义它。

可以使用服务标签添加约束,因此我无法知道在定义树构建器配置时也会存在什么约束。

现在,我有以下配置:

$rootNode
        ->addDefaultsIfNotSet()
        ->performNoDeepMerging()
        ->children()
            ->arrayNode('slots')
                ->prototype('array')
                    ->children()
                        ->arrayNode('constraints')
                            ->prototype('array')
                                ->prototype('scalar') # Here a constraint may need an array or a more complex object. A "prototype('mixed')" would be handy..
                                ->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ->end();

是否有一个“通配符”节点将它下面的所有内容都作为一个通用数组而不进行任何处理?没找到。

感谢您的帮助!

编辑

感谢 Mawcel 的回答,正确的配置如下所示:

$rootNode
        ->addDefaultsIfNotSet()
        ->performNoDeepMerging()
        ->children()
            ->arrayNode('slots')
                ->prototype('array')
                    ->children()
                        ->arrayNode('constraints')
                            ->prototype('array')
                                ->prototype('variable') # The wildcard I was looking for..
                                ->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ->end();

【问题讨论】:

    标签: php symfony configuration yaml bundle


    【解决方案1】:

    您好,您需要将arrayNodeuseAttributeAsKey 一起使用,它将允许您拥有动态名称的配置参数:

    $rootNode
        ->arrayNode('slots')
             ->useAttributeAsKey('name')
             ->prototype('array')
             //
    

    http://symfony.com/doc/current/components/config/definition.html#array-node-options

    否则,您也可以使用->variableNode() 定义任意配置值。

    http://api.symfony.com/2.3/Symfony/Component/Config/Definition/VariableNode.html

    【讨论】:

    • 谢谢! “variableNode()”是我所缺少的。我只是用prototype('variable') 替换了最低级别的prototype('scalar') 并且它有效:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多