验证相互依赖的配置值
Validating inter-dependent configuration values
我的 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。某种post-验证)
编辑:在@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()
个条目之后,否则将无效。
是的,您可以使用 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
我的 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。某种post-验证)
编辑:在@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()
个条目之后,否则将无效。
是的,您可以使用 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