如何为一个Bundle创造友好的配置

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

###使用Bundle扩展类

在app/config/config.yml中为自己bundle配置参数
acme_demo:#这个为需要配置bundle的别名
    demo:
        client_id: 123
        client_secret: xxxx

在上一篇如何加载服务中讲到如何创建一个扩展类;在扩展类中处理这些配置参数

在load()方法中symfony自动会把YML或XML格式的配置参数转换成数组了

array(
    // values from config.yml
    array(
        'demo' => array(
            'client_id' => 123,
            'client_secret' => xxx,
        ),
    ),
    // values from config_dev.yml
    array(
        'demo' => array(
            'client_id' => 456,
        ),
    ),
)

需要注意这是一个多维数组;各种环境下加载的配置不一样;

symfony提供了方法能够让根据环境不同选择不同的参数而且还可以验证参数的正确性

####添加配置类

// src/Acme/DemoBundle/DependencyInjection/Configuration.php
namespace Acme\DemoBundle\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('acme_social');

        $rootNode
            ->children()
                ->arrayNode('demo')
                    ->children()
                        ->integerNode('client_id')->end()#整形节点
                        ->scalarNode('client_secret')->end()#标量类型
                    ->end()
                ->end() // twitter
            ->end()
        ;

        return $treeBuilder;
    }
}

在load()方法中验证以及合并配置

public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();

    $config = $this->processConfiguration($configuration, $configs);
    // ...
}

可以让扩展类继承ConfigurableExtension来减少每次都要调用processConfiguration方法来验证合并配置

class Test2Extension extends ConfigurableExtension
{
    //注意这个方法名称不是load;
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container)
    {
        // ...
    }
}

转载于:https://my.oschina.net/u/729139/blog/543162

你可能感兴趣的:(如何为一个Bundle创造友好的配置)