SymfonyでarrayNodeのデフォルト値を設定する

April 28, 2017,
tags: symfony php


このエントリーをはてなブックマークに追加

SymfonyでBundle作っているとConfiguration.phpで設定を定義する事はよくある事だと思います。
arrayNodeをよく使うのですが、毎回デフォルト値でハマってその度にググって調べていたのでこのブログに調べたことを載せておく・・・

defaultValue()だけではデフォルト値が設定できない。

arrayNodeデフォルト値を設定する場合に以下のように書くことってよくあるかと思います。

// 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:って怒られてしまいます・・・。

// 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が必要になります。

// 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をつければ大丈夫です。

comments powered by Disqus