如果你打开你的应用程序配置文件(app/config/config.yml),你将在这里看到许多的配置,比如framework,twig和doctrine。每一个配置都是一个bundle的配置,允许你定义一些高级别的配置,让你的bundle去构造所有低级配置,复杂和灵活的改变要基于你的配置文件里的设置。
例如,下面的这个配置会告诉FrameworkBundle去启用这个form,他会涉及到相当多的服务,以及其他相关部件的集成:
1 2 |
framework: form: true |
使用参数去配置你的bundle
如果你没有计划在项目之间分享你的bundle,在你的配置中就没有意义去使用高级的方式。因为你使用这个bundle仅仅在一个项目中,你每次可以去改变服务的配置。
如果你想去在config.yml中配置一些东西,你能够在这里创建一个参数,在任何地方使用它。
使用Bundle扩展
基本的想法是,与其这个用户覆盖各个参数,不如你让这些用户去配置这几个参数。作为这个bundle的设计者,你去解析这个配置并加载当前服务和参数到一个“Extension”类。
作为一个案例,猜想你去创建一个社交bundle,相当于提供一个twitter整合。这个bundle是可重用的,你有两个可配置的client_id和client_secret变量。你的bundle配置看起来像:
1 2 3 4 5 |
# app/config/config.yml acme_social: twitter: client_id: 123 client_secret: $ecret |
关于更多的extension请阅读How to Load Service Configuration inside a Bundle.
如果一个bundle提供一个Extension类,那么你应该不会覆盖bundle的任何服务容器参数。我的意思是,如果一个Extension类存在时,每一个应该可以配置的设置都应该存在于这个类的有效配置中。换句话说,这个类定义了所有的公共配置选项,他有着很好的兼容性。
依赖注入容器对于参数的处理请看Using Parameters within a Dependency Injection Class.
处理$configs数组
先说重要的,你必须创建一个extension类就好像How to Load Service Configuration inside a Bundle.
每当用户从配置文件中包含acme_social键(他是DI别名),其下的配置将被添加到配置数组,并传递给extension的load()方法(symfony会自动转换xml和yaml到一个数组)。
对于配置的例子在前面的部分,这个数组传入到你的load方法中就像是这样:
1 2 3 4 5 6 7 8 |
array( array( 'twitter' => array( 'client_id' => 123, 'client_secret' => '$ecret', ), ), ) |
记住这是一个多维数组,不仅仅是一个包含配置值得单一平面数组。这样做是故意的,因为他允许symfony解析几个配置资源。例如如果acme_social出现在其他配置文件-例如config_dev.yml-下面他又不同的值进入这个数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
array( // values from config.yml array( 'twitter' => array( 'client_id' => 123, 'client_secret' => '$secret', ), ), // values from config_dev.yml array( 'twitter' => array( 'client_id' => 456, ), ), ) |
这两个数组的顺序决定哪一个先设置。
但是别担心!symfony的配置组件会帮助你合并这些值,并提供默认值,还有验证用户配置是否正确。这是它是如何工作的。在DependencyInjection目录中创建一个Configuration类并构建一个树状,来定义你bundle配置的节点。
这个Configuration类处理简单的配置就像这样:
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 26 27 |
// src/Acme/SocialBundle/DependencyInjection/Configuration.php namespace Acme\SocialBundle\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('twitter') ->children() ->integerNode('client_id')->end() ->scalarNode('client_secret')->end() ->end() ->end() // twitter ->end() ; return $treeBuilder; } } |
这个Configuration类可能会比这里的复杂很多,都支持“prototype”节点,高级验证,XML-specific标准化和高级合并。你能够看到在 the Config component documentation有更详细的。
未完待续中。。。。。。。