【问题标题】:Symfony2 processing configuration removes itemsSymfony2 处理配置删除项目
【发布时间】:2015-02-21 20:39:25
【问题描述】:

我使用 Symfony2 的 ConfigurationInterface 来验证我的包中的配置。我利用了它的规范化方法,这样我自己解析配置时就不必检查值是否存在。

这种方法ignoreExtraKeys 给了我一个曲线球。文档状态:

允许在数组下指定额外的配置键而不会引发异常。 这些配置值被简单地忽略。这应该仅在您希望通过只处理部分数组的特殊树发送整个配置数组的特殊情况下使用。

这让我相信那些额外的键会保留在结果数组中。碰巧的是,他们不是。我可以为每个键定义一个规则,但这是不可能的。这个特定的配置文件定义了表单的结构、表单类型和应该传递给每种类型的选项。需要考虑的选项太多了,它会忽略自定义类型,并且 Symfony 的表单构建器已经验证了这些选项。

在我编写一个额外的方法将这些键合并回数组之前,有什么方法可以强制配置验证器将键保留在原位。

即。我希望它验证和规范化我的配置,但也忽略它不知道的键。

【问题讨论】:

    标签: validation symfony configuration


    【解决方案1】:

    an option 可能会被添加到 Symfony 2.7 版中的ignoreExtraKeys 方法中。

    对于 2.6 及以下的解决方案有点麻烦。首先,variableNode 可用于任何无需验证的数据类型。这些节点中的数据保留在输出中。原始的arrayNode 必须替换为variableNode,然后对于每个需要验证的孩子,必须使用validate 的自定义闭包。

    例如,现有代码如下:

    ->arrayNode('options')
        ->ignoreExtraKeys()
        ->children()
            ->scalarNode('sub-option')->end()
        ->end()
    ->end()
    

    需要转换为:

    ->variableNode('options')
        ->validate()
            ->ifTrue(function($v){
                return !(is_array($v) && isset($v['sub-option']) && is_scalar($v['sub-option']);
            })
            ->thenInvalid('Wrong config')
        ->end()
    ->end()
    

    这可以通过重构配置来简化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2015-03-26
      • 2014-03-21
      相关资源
      最近更新 更多