Symfony2 处理配置删除项

Symfony2 processing configuration removes items

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

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

Allows extra config keys to be specified under an array without throwing an exception. Those config values are simply ignored. This should be used only in special cases where you want to send an entire configuration array through a special tree that processes only part of the array.

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

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

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

在 Symfony 2.7 版本的 ignoreExtraKeys 方法中可能会添加 an option

对于 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()

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