使用ArrayNodeDefinition :: addDefaultChildrenIfNoneSet()的怪异行为

ah

在Silex框架中使用Symfony Config Component,我需要一个数据数组,其中包含一个版本数组:

some_data:
    # some config...
    versions:
        - 1.1
        - 1.2-beta
        ...

这是配置树生成器的一瞥:

$node = $treeBuilder->root('some_data');

$node
    ->children()
        // some nodes...
        ->arrayNode('versions')
            ->addDefaultChildrenIfNoneSet()
            ->validate()
                ->ifTrue(function ($v) {
                    return !empty($v);
                })
                ->then(function ($v) {
                    $array = array_values(array_unique($v));
                    sort($array, SORT_NATURAL | SORT_FLAG_CASE);

                    return $array;
                })
            ->end()
            ->prototype('scalar')->defaultValue('1')->end()
        ->end()
    ->end()
->end()

当没有versions设置时,我得到了default 1,好的。但是,当我添加其他一些版本然后尝试删除默认值时1,它总是在处理配置后返回。

有人知道我在做什么错吗?这是预期的行为吗?

ah

看来这addDefaultChildrenIfNoneSet()是一种验证,并且在处理配置addDefaultChildrenIfNoneSet()->validate()结果时都将其合并。

为了避免这种行为,只需添加performNoDeepMerging()到节点:

$node = $treeBuilder->root('some_data');

$node
    ->children()
        // some nodes...
        ->arrayNode('versions')
            ->addDefaultChildrenIfNoneSet()
            ->performNoDeepMerging() // This is the fix
            ->validate()
                ->ifTrue(function ($v) {
                    return !empty($v);
                })
                ->then(function ($v) {
                    $array = array_values(array_unique($v));
                    sort($array, SORT_NATURAL | SORT_FLAG_CASE);

                    return $array;
                })
            ->end()
            ->prototype('scalar')->defaultValue('1')->end()
        ->end()
    ->end()
->end()

参见http://symfony.com/doc/current/components/config/definition.html#optional-sections

另一种方法是:

// add a default value on the array, not on the prototype :
$node
    ->children()
        // some nodes...
        ->arrayNode('versions')
            ->validate()
                ->ifTrue(function ($v) {
                    return !empty($v);
                })
                ->then(function ($v) {
                    $array = array_values(array_unique($v));
                    sort($array, SORT_NATURAL | SORT_FLAG_CASE);

                    return $array;
                })
            ->end()
            ->prototype('scalar')->end()
            ->defaultValue(['1']) // this is a fix
        ->end()
    ->end()
->end()

// or just use one validation rule
$node
    ->children()
        // some nodes...
        ->arrayNode('versions')
            ->validate()
                ->always(function ($v) { // another fix
                    if (empty($v)) {
                        return ['1'];
                    }

                    $array = array_values(array_unique($v));
                    sort($array, SORT_NATURAL | SORT_FLAG_CASE);

                    return $array;
                })
            ->end()
            ->prototype('scalar')->end()
        ->end()
    ->end()
->end()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用声明的怪异行为

来自分类Dev

在JavaScript中使用+ +时的怪异行为

来自分类Dev

Internet Explorer使用PHP的怪异行为

来自分类Dev

使用断点的Monotouch怪异行为

来自分类Dev

使用双指针时的怪异行为

来自分类Dev

使用HashMap时的怪异行为

来自分类Dev

使用filepath.Glob的Golang怪异行为

来自分类Dev

在函数中使用data.table怪异行为

来自分类Dev

使用AngularJS上传多个文件时的怪异行为

来自分类Dev

使用字符串大小的模数怪异行为

来自分类Dev

使用JFrog CLI时Artifactory中的怪异行为下载

来自分类Dev

bwareafilt在MATLAB中的怪异行为,它使用什么算法?

来自分类Dev

使用嵌套表格单元格时的怪异行为

来自分类Dev

SSH的怪异行为,未使用正确的密钥注释

来自分类Dev

在库中使用事件库在Python中使用FLASK socketIO的怪异行为

来自分类Dev

在Android中使用Path.arcTo()绘制圆环的怪异行为

来自分类Dev

在CUDA中使用推力experiment :: pinned_allocator的怪异行为

来自分类Dev

密集代码片段之前,使用loader的style.display的JS怪异行为

来自分类Dev

在withLatestFrom运算子中使用ngrx效果时的怪异行为

来自分类Dev

如何使用图形适配器摆脱随机的“鬼影”监视器和怪异行为

来自分类Dev

Python:使用timeit的“ from module”与“ from__main__”怪异行为

来自分类Dev

使用.XY类型选择器的CSS之后的属性怪异行为

来自分类Dev

尝试使用html5 canvas动画精灵图像时的怪异行为

来自分类Dev

在C怪异行为中使用结构传递数组及其长度

来自分类Dev

使用grunt-exec在新行中产生怪异行为

来自分类Dev

AudioServicesPlaySystemSound怪异行为

来自分类Dev

getline()的怪异行为

来自分类Dev

GDB的怪异行为

来自分类Dev

map()的怪异行为

Related 相关文章

  1. 1

    使用声明的怪异行为

  2. 2

    在JavaScript中使用+ +时的怪异行为

  3. 3

    Internet Explorer使用PHP的怪异行为

  4. 4

    使用断点的Monotouch怪异行为

  5. 5

    使用双指针时的怪异行为

  6. 6

    使用HashMap时的怪异行为

  7. 7

    使用filepath.Glob的Golang怪异行为

  8. 8

    在函数中使用data.table怪异行为

  9. 9

    使用AngularJS上传多个文件时的怪异行为

  10. 10

    使用字符串大小的模数怪异行为

  11. 11

    使用JFrog CLI时Artifactory中的怪异行为下载

  12. 12

    bwareafilt在MATLAB中的怪异行为,它使用什么算法?

  13. 13

    使用嵌套表格单元格时的怪异行为

  14. 14

    SSH的怪异行为,未使用正确的密钥注释

  15. 15

    在库中使用事件库在Python中使用FLASK socketIO的怪异行为

  16. 16

    在Android中使用Path.arcTo()绘制圆环的怪异行为

  17. 17

    在CUDA中使用推力experiment :: pinned_allocator的怪异行为

  18. 18

    密集代码片段之前,使用loader的style.display的JS怪异行为

  19. 19

    在withLatestFrom运算子中使用ngrx效果时的怪异行为

  20. 20

    如何使用图形适配器摆脱随机的“鬼影”监视器和怪异行为

  21. 21

    Python:使用timeit的“ from module”与“ from__main__”怪异行为

  22. 22

    使用.XY类型选择器的CSS之后的属性怪异行为

  23. 23

    尝试使用html5 canvas动画精灵图像时的怪异行为

  24. 24

    在C怪异行为中使用结构传递数组及其长度

  25. 25

    使用grunt-exec在新行中产生怪异行为

  26. 26

    AudioServicesPlaySystemSound怪异行为

  27. 27

    getline()的怪异行为

  28. 28

    GDB的怪异行为

  29. 29

    map()的怪异行为

热门标签

归档