2

Symfony 2.0 のバンドル内でセマンティック構成を公開しようとしていますが、NodeDefinition クラスで defaultValue を機能させるのに問題があります。空のバンドルを生成し、構成が機能するために必要なファイルを作成し、構成値を取得できましたが、defaultValue を構成項目に設定したいと考えています。defaultValue() メソッドを使用して config.yml から構成項目を削除すると、空の配列が表示されますか? defaultValue() が実際にどのように機能するかを誰かが説明できますか?

<?php
// ./DependencyInjection/Configuration.php

namespace Test\Bundle\TestBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('test_bundle');

        $rootNode
            ->children()
                ->scalarNode('foo')->defaultValue('bar')->end()
            ->end();

        return $treeBuilder;
    }
}

-

<?php
// ./DependencyInjection/TestBundleExtension.php

namespace Test\Bundle\TestBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

class TestBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        var_dump($configs); // empty array

        $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.xml');
    }
}

したがって、上記の構成クラスから、構成項目「test_bundle.foo」が欠落している場合、その値は「bar」に設定されます...はい? うーん、そう思ったけどそうじゃない。

4

1 に答える 1

5

ルートノードは配列ノードです。デフォルトでは、キーを設定しない場合、デフォルト値は適用されません。デフォルト値を機能させる方法の2つの例:

  1. 値をnullに設定します。

    # in the config.yml
    test_bundle:
        foo: ~
    
  2. 設定されていない場合はデフォルト値を使用するようにルートノードに指示します。

    // in your Configuration.php
    $rootNode
        ->addDefaultsIfNotSet()
        ->children()
            ->scalarNode('foo')->defaultValue('bar')->end()
        ->end();
    
    # in the config.yml
    test_bundle: ~
    
于 2012-05-05T09:11:07.933 に答える