Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 验证相互依赖的配置值_Php_Symfony_Symfony 2.8 - Fatal编程技术网

Php 验证相互依赖的配置值

Php 验证相互依赖的配置值,php,symfony,symfony-2.8,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()

我的
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();
$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"');
->validate()
->ifTrue(function ($v) {
    return $v['option_b'] > $v['option_a'];
})
->thenInvalid('Invalid auto generate mode value %s')

虽然这可以正常工作,但我还有一个额外的需求,我不知道如何实现。在我的例子中,条件
config_bYes您可以使用
validate
和回调来检查选项中的两个元素。它应该是这样的:

$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();
$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"');
->validate()
->ifTrue(function ($v) {
    return $v['option_b'] > $v['option_a'];
})
->thenInvalid('Invalid auto generate mode value %s')

另请参见:

您还可以查看DoctrineBundle中的配置文件。我想他们正在使用这个。嗯,我想你一次只能在一个配置值上使用。谢谢,我将尝试一下。您可能必须将验证放在包含子节点的父节点上,它才能工作。