根据另一个配置设置设置Symfony2配置默认值


Set a Symfony2 config default value based on another config setting

使用Symfony2,我知道如何使用Configuration.php文件通过config.yml设置捆绑包可用的选项。但是,我不知道如何将一个选项设置为默认值(或者这是否容易实现(。

我要找的是有一个类似这样的配置:

->scalarNode('option_one')
    ->defaultValue('peanuts')
    ->cannotBeEmpty()
->end()
->scalarNode('option_two')
    ->defaultValue('%option_one%')
->end()

因此:

# config.yml
my_bundle:
    set_one:
        option_one: foo
        option_two: bar
    set_two:
        option_one: baz
    set_three: ~

对于set_one,我们将使option_two设置为bar

对于set_twooption_two将被设置为baz(通过与option_one匹配的默认设置(。

对于set_threeoption_oneoption_two都将设置为默认值peanuts

也许我找错地方了。。。也许在配置过程中的其他地方,"丢失"的值可能会被捕获,并根据其兄弟值(或更广泛的配置(设置为默认值?

validate()的文档say(emphasis mine(:

表达式接收节点的值,并且必须返回它。它可以修改它。

因此,您可以利用此功能,根据需要根据其他值实际设置默认值。

->scalarNode('option_one')
    ->defaultValue('peanuts')
    ->cannotBeEmpty()
->end()
->scalarNode('option_two')
    ->defaultNull()
->end()
->validate()
  ->always(function(array $config) {
    if (!$config['option_two']) {
      $config['option_two'] = $config['option_one'];
    }
    return $config;
  })
->end()

有两种可能性:

  • 如您在评论中指出的那样,动态修改扩展中的配置
  • 使用规范化,正如这里用闭包解释的那样