3

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

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

这是我目前的做法,但我不确定这是否是“最佳实践”。我要验证的配置项是root_node.

配置.yml

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

配置.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()

或者,如果做不到这一点,则执行我的验证规则的最佳方法。

4

1 回答 1

5

您可以做的是将该ifTrue方法与您的自定义函数一起使用。像这样的东西:

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

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

于 2012-12-11T16:03:04.193 回答