如何在一个Bundle中创建一个友好的配置(3.0)

如果你打开你的应用程序配置文件(app/config/config.yml),你将在这里看到许多的配置,比如framework,twig和doctrine。每一个配置都是一个bundle的配置,允许你定义一些高级别的配置,让你的bundle去构造所有低级配置,复杂和灵活的改变要基于你的配置文件里的设置。

例如,下面的这个配置会告诉FrameworkBundle去启用这个form,他会涉及到相当多的服务,以及其他相关部件的集成:

 使用参数去配置你的bundle

如果你没有计划在项目之间分享你的bundle,在你的配置中就没有意义去使用高级的方式。因为你使用这个bundle仅仅在一个项目中,你每次可以去改变服务的配置。

如果你想去在config.yml中配置一些东西,你能够在这里创建一个参数,在任何地方使用它。

 

使用Bundle扩展

基本的想法是,与其这个用户覆盖各个参数,不如你让这些用户去配置这几个参数。作为这个bundle的设计者,你去解析这个配置并加载当前服务和参数到一个“Extension”类。

作为一个案例,猜想你去创建一个社交bundle,相当于提供一个twitter整合。这个bundle是可重用的,你有两个可配置的client_id和client_secret变量。你的bundle配置看起来像:

 关于更多的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方法中就像是这样:

记住这是一个多维数组,不仅仅是一个包含配置值得单一平面数组。这样做是故意的,因为他允许symfony解析几个配置资源。例如如果acme_social出现在其他配置文件-例如config_dev.yml-下面他又不同的值进入这个数组:

这两个数组的顺序决定哪一个先设置。

但是别担心!symfony的配置组件会帮助你合并这些值,并提供默认值,还有验证用户配置是否正确。这是它是如何工作的。在DependencyInjection目录中创建一个Configuration类并构建一个树状,来定义你bundle配置的节点。

这个Configuration类处理简单的配置就像这样:

这个Configuration类可能会比这里的复杂很多,都支持“prototype”节点,高级验证,XML-specific标准化和高级合并。你能够看到在 the Config component documentation有更详细的。

 

未完待续中。。。。。。。

发表评论