就像在标题中一样。我希望我的捆绑配置中的部分一旦启用 - 它将具有一些必需的字段。目前我不知道如何实现这一目标。我尝试了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
我希望能够禁用"默认值",但如果此部分已启用(默认情况下应该是什么):user
和firewall
应该是必需的明确设定。
答案 0 :(得分:0)
您的配置树按预期工作。我要做的唯一更改是将canBeDisabled()
更改为caBeEnabled()
。虽然这只是我的意见,但没什么区别。我想你可能会混淆它是如何运作的。
您的配置:
mybundle:
defaults:
user: default
firewall: default
controllers:
registration: true
将使用整个树进行验证。输出将包含$sonfig['defaults']['enabled']
设置为true的额外键。根据您的配置树,user
和firewall
都必须包含值。
现在,如果你指定一个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()
方法来完成类似的操作。