在Symfony2配置TreeBuilder中使用正则表达式验证?

时间:2012-12-11 15:19:31

标签: php symfony configuration

我正在使用Symfony2的树构建器,我看到它有一些基本的验证规则,如下所述:http://symfony.com/doc/current/components/config/definition.html#validation-rules

有没有办法通过正则表达式进行验证?

这就是我现在正在做的事情,但我不确定这是否是“最佳做法”。我要验证的配置项是root_node

config.yml

my_bundle:
    root_node: /some/path    # this one is valid

的configuration.php

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('my_bundle');

$rootNode
    ->children()
        ->scalarNode('root_node')
             ->end()
        ->end()
    ->end();

return $treeBuilder;

MyBundleExtension.php

$nodePattern = '#/\w+(/w+)*#';
if (! preg_match($nodePattern, $config['root_node'])) {
    throw new \Exception("root_node is not valid: must match the pattern: $nodePattern");
}

所以,我真正想要的是一个TreeBuilder方法:

->validate()->ifNotMatchesRegex()->thenInvalid()

或者,如果没有,那就是执行我的验证规则的最佳方法。

1 个答案:

答案 0 :(得分:5)

您可以使用自定义函数使用ifTrue方法。像这样:

$rootNode
    ->children()
        ->scalarNode('root_node')
            ->validate()
            ->ifTrue(function ($s) {
                return preg_match('#/\w+(/\w+)*#', $s) !== 1;
            })
                ->thenInvalid('Invalid path')
            ->end()
       ->end()
   ->end();

请注意我对你的正则表达式做的轻微修改。