【问题标题】:Validating inter-dependent configuration values验证相互依赖的配置值
【发布时间】:2017-12-18 09:25:32
【问题描述】:

我的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()方法中完成? (也就是某种后验证)


编辑:在@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() 条目之后,否则将不起作用。

【问题讨论】:

    标签: php symfony symfony-2.8


    【解决方案1】:

    是的,您可以使用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

    【讨论】:

    • 你也可以看看DoctrineBundle里面的配置文件。我认为他们正在使用它。
    • 嗯,我以为您一次只能在 1 个配置值上使用它们。谢谢,我试试看。
    • 您可能必须将验证放在包含子节点的父节点上才能正常工作。
    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2020-02-13
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多