Symfony2:带有必填字段的条件包配置节

时间:2016-03-19 18:16:12

标签: symfony configuration

就像在标题中一样。我希望我的捆绑配置中的部分一旦启用 - 它将具有一些必需的字段。目前我不知道如何实现这一目标。我尝试了canBeEnabled()和canBeDisabled()选项,如下所述:http://symfony.com/doc/current/components/config/definition.html#optional-sections。但没有运气。我的意思是,即使禁用了section,如果它包含必填字段 - 也会抛出错误。我想要实现的是,只有在启用了section时才填充字段时才会出现错误。有没有办法实现这个目标?

我的配置验证:

    $rootNode
        ->children()
            ->arrayNode('defaults')->canBeDisabled()
                ->children()
                    ->scalarNode('firewall')->isRequired()->cannotBeEmpty()->end()
                    ->scalarNode('user')->isRequired()->cannotBeEmpty()->end()
                    ->arrayNode('controllers')
                        ->children()
                            ->booleanNode('registration')->defaultTrue()->end()
                        ->end()
                    ->end()
                ->end()
            ->end()

在我的配置中:

mybundle:
    defaults:
        user: default
        firewall: default
        controllers:
            registration: true

我希望能够禁用"默认值",但如果此部分已启用(默认情况下应该是什么):userfirewall应该是必需的明确设定。

1 个答案:

答案 0 :(得分:0)

您的配置树按预期工作。我要做的唯一更改是将canBeDisabled()更改为caBeEnabled()。虽然这只是我的意见,但没什么区别。我想你可能会混淆它是如何运作的。

您的配置:

mybundle:
    defaults:
        user: default
        firewall: default
        controllers:
            registration: true

将使用整个树进行验证。输出将包含$sonfig['defaults']['enabled']设置为true的额外键。根据您的配置树,userfirewall都必须包含值。

现在,如果你指定一个config.yml:

mybundle: ~

跳过defaults分支内的所有内容。生成的数组看起来像$sonfig['defaults']['enabled'] = false。没有默认值添加到输出。没有。 enabled密钥是一种快速检测方法。

要启用/禁用分支,您需要重新配置config.yml,使所有参数都在一个密钥下。有点像(不知道捆绑的目的,很难猜出合适的名字):

mybundle:
    access:
        defaults:
            user: default
            firewall: default
            controllers:
                registration: true

配置树看起来像:

$rootNode
->children()
    ->arrayNode('access')
    ->canBeDisabled()
        ->children()
            ->arrayNode('defaults')
                ->children()
                    ->scalarNode('firewall')->isRequired()->cannotBeEmpty()->end()
                    ->scalarNode('user')->isRequired()->cannotBeEmpty()->end()
                    ->arrayNode('controllers')
                        ->children()
                            ->booleanNode('registration')->defaultTrue()->end()
                        ->end()
                    ->end()
                ->end()
            ->end();

现在配置可能如下所示:

mybundle:
    access: ~

甚至根本没有声明:

mybundle:
    other_non_optional_key: foo

另一方面,我不喜欢必须使用额外的嵌套级别。当需要字段存在时,我会在canBeDisabled()consider it a bug。您可以使用isRequired()替换defaultValue()并使用自定义validate()方法来完成类似的操作。