Php Symfony2 TreeBuilder配置-根据设定值进行验证

Php Symfony2 TreeBuilder配置-根据设定值进行验证,php,symfony,symfony-2.1,Php,Symfony,Symfony 2.1,对于捆绑包,我有以下配置: $supportedAdapters = array('curl', 'socket'); $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('example_bundle'); $rootNode ->children() ->scalarNode('username')->isRe

对于捆绑包,我有以下配置:

    $supportedAdapters = array('curl', 'socket');

    $treeBuilder = new TreeBuilder();
    $rootNode = $treeBuilder->root('example_bundle');
    $rootNode
            ->children()
            ->scalarNode('username')->isRequired()->cannotBeEmpty()->end()
            ->scalarNode('password')->isRequired()->cannotBeEmpty()->end()
            ->scalarNode('adapter')
                ->validate()
                    ->ifNotInArray($supportedAdapters)
                    ->thenInvalid('The adapter %s is not supported. Please choose one of '.json_encode($supportedAdapters))
                ->end()
                ->cannotBeOverwritten()
                ->isRequired()
                ->cannotBeEmpty()
            ->end()
            // allow the use of a proxy for cURL requests
            ->arrayNode('proxy')
                ->children()
                    ->scalarNode('host')->isRequired()->cannotBeEmpty()->end()
                    ->scalarNode('port')->isRequired()->cannotBeEmpty()->end()
                    ->scalarNode('username')->defaultValue(null)->end()
                    ->scalarNode('password')->defaultValue(null)->end()
                ->end()
            ->end();

    return $treeBuilder;
我们支持两个适配器:
curl
socket

我们只支持对
curl
请求使用代理。在配置中,我想检查是否设置了代理并且适配器不是curl,然后抛出一个错误,通知用户“我们只支持curl适配器与代理一起使用”。有没有办法获取一个设置值(在我们的适配器中)并检查它的值并根据它进行验证

伪代码:

IF PROXY IS SET AND ADAPTER IS NOT EQUAL TO CURL THEN:
 THROW ERROR ("We don't support the use of a proxy with the socket adapter");
END IF;
我希望这是有道理的。我已经阅读了所有的文档和API文档,但是,唉,我看不到实现这一点的选项。

解决了这个问题:

    $supportedAdapters = array('curl', 'socket');

    $treeBuilder = new TreeBuilder();
    $rootNode = $treeBuilder->root('example_bundle');
    $rootNode
            ->validate()
                ->ifTrue(function($v){ return isset($v['proxy']) && 'curl' !== $v['adapter'];})
                ->thenInvalid('Proxy support is only available to the curl adapter.')
            ->end()
            ->children()
                ->scalarNode('username')->isRequired()->cannotBeEmpty()->end()
                ->scalarNode('password')->isRequired()->cannotBeEmpty()->end()
                ->scalarNode('adapter')
                    ->validate()
                        ->ifNotInArray($supportedAdapters)
                        ->thenInvalid('The adapter %s is not supported. Please choose one of '.json_encode($supportedAdapters))
                    ->end()
                    ->cannotBeOverwritten()
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
                // allow the use of a proxy for cURL requests
                ->arrayNode('proxy')
                    ->children()
                        ->scalarNode('host')->isRequired()->cannotBeEmpty()->end()
                        ->scalarNode('port')->isRequired()->cannotBeEmpty()->end()
                        ->scalarNode('username')->defaultValue(null)->end()
                        ->scalarNode('password')->defaultValue(null)->end()
                    ->end()
            ->end();

    return $treeBuilder;
:-)