5
$rootNode
    ->children()
        ->arrayNode('form')
            ->info('form configuration')
            ->canBeUnset()
            ->treatNullLike(array('enabled' => true))
            ->treatTrueLike(array('enabled' => true))
            ->children()
                ->booleanNode('enabled')->defaultTrue()->end()
            ->end()
        ->end()

上述代码片段的第 5 行Symfony\Bundle\FrameworkBundle\DependencyInjection\Configuration使用了方法canBeUnset()。我不知道这是做什么的,因为如果我删除它似乎什么也做不了。我正在为我自己的包理解语义配置。

4

1 回答 1

6

Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition在代码之后,您可以在类中找到此方法的定义。

/**
 * Sets whether the node can be unset.
 *
 * @param Boolean $allow
 *
 * @return ArrayNodeDefinition
 */
public function canBeUnset($allow = true)
{
    $this->merge()->allowUnset($allow);

    return $this;
}

这被传递给Symfony/Component/Config/Definition/Builder/MergeBuilder处理配置合并的 MergeBuilder ( )。

/**
 * Sets whether the node can be unset.
 *
 * @param Boolean $allow
 *
 * @return MergeBuilder
 */
public function allowUnset($allow = true)
{
    $this->allowFalse = $allow;

    return $this;
}

所以我的理解是,这种方法定义了,如果您的配置值可以在合并配置时取消设置,以防覆盖配置不支持该值。不过,如果不允许取消设置,我将不得不进行测试,以找出行为,但我想它会抛出一个关于缺少配置值的异常,就像isRequired.

于 2012-09-09T09:44:06.887 回答