SymfonyでBundle作っているとConfiguration.phpで設定を定義する事はよくある事だと思います。
arrayNodeをよく使うのですが、毎回デフォルト値でハマってその度にググって調べていたのでこのブログに調べたことを載せておく・・・
defaultValue()だけではデフォルト値が設定できない。
arrayNodeデフォルト値を設定する場合に以下のように書くことってよくあるかと思います。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// src/HogeBundle/DependencyInjection/Configuration.php
class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('hoge');
$rootNode->children()
->arrayNode('aws_s3')
->children()
->scalarNode('bucket')->defaultValue('hogehoge')->end()
->scalarNode('path')->defaultValue('/hoge/fuga')->end()
->end()
->end()
;
return $treeBuilder;
}
}
|
しかし、このような書き方だとdefaultValue()の値が設定されません・・・。
config.ymlで設定しなければ、デフォルト値としてhogehoge
,/hoge/fuga
が設定されるのかと思いきや、ダメなんですよね・・・。
Extensionで$config['aws_s3']['bucket']
や$config['aws_s3']['path']
は定義されていないのでNotice: Undefined index:
って怒られてしまいます・・・。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// src/HogeBundle/DependencyInjection/Extension.php
class HogeExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$container->setParameter('hoge_bundle.aws_s3.bucket', $config['aws_s3']['bucket']); // Notice: Undefined index: bucketって出てしまう・・・
$container->setParameter('hoge_bundle.aws_s3.path', $config['aws_s3']['path']); // Notice: Undefined index: pathって出てしまう・・・
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
}
}
|
addDefaultsIfNotSetを利用する
デフォルト値を設定する場合はaddDefaultsIfNotSet
が必要になります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
// src/HogeBundle/DependencyInjection/Configuration.php
class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('hoge');
$rootNode->children()
->arrayNode('aws_s3')
->addDefaultsIfNotSet()
->children()
->scalarNode('bucket')->defaultValue('hogehoge')->end()
->scalarNode('path')->defaultValue('/hoge/fuga')->end()
->end()
->end()
;
return $treeBuilder;
}
}
|
公式のドキュメント見ればガッツリ書いてありますね。。
Defining and Processing Configuration Values
If any child nodes have default values, use them if explicit values haven't been provided.
ということでデフォルト値を設定する場合にはaddDefaultsIfNotSetをつければ大丈夫です。