验证相互依赖的配置值

时间:2017-12-18 09:25:32

标签: php symfony symfony-2.8

我的AppBundle中有一个配置文件:

app:
    config_a: 100
    config_b: 50

我这样验证:

$treeBuilder = new TreeBuilder();

$rootNode = $treeBuilder->root('app');

$rootNode
    ->children()
        ->integerNode('config_a')
            ->isRequired()
            ->min(1)
            ->max(1000)
        ->end()
        ->integerNode('config_b')
            ->isRequired()
            ->min(1)
            ->max(999)
        ->end()
    ->end();

虽然这项工作正常但我还有另外一项要求,即我无法弄清楚如何实施。在我的情况下,条件config_b <= config_a必须始终为真,但我无法在Symfony的文档中找到有关如何执行此类操作的任何内容。

我们如何根据其他配置值验证配置值?

Symfony支持这样的东西吗?或者只能在相应的ExtensionInterface::load()方法中完成? (a.k.a.某种后验证)

编辑:在@ dbrumann建议的帮助下,我设法使其成功。最终配置树如下所示:

$treeBuilder = new TreeBuilder();

$rootNode = $treeBuilder->root('app');

$rootNode
    ->children()
        ->integerNode('config_a')
            ->isRequired()
            ->min(1)
            ->max(1000)
        ->end()
        ->integerNode('config_b')
            ->isRequired()
            ->min(1)
            ->max(999)
        ->end()
    ->end()
    ->validate()
    ->ifTrue(function ($v) {
        return $v['config_b'] > $v['config_a'];
    })
    ->thenInvalid('"config_b" should be <= "config_a"');

请注意,验证码必须在children()条之后,否则无法正常工作。

1 个答案:

答案 0 :(得分:2)

是的,您可以使用validate和回调检查选项中的两个元素。看起来应该是这样的:

->validate()
->ifTrue(function ($v) {
    return $v['option_b'] > $v['option_a'];
})
->thenInvalid('Invalid auto generate mode value %s')

另请参阅:https://symfony.com/doc/current/components/config/definition.html#validation-rules