如何简化多个bundle的配置
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何简化多个bundle的配置
在构建可重用和可扩展的应用程序时,开发人员经常面临一个选择:创建一个大型捆绑包或多个较小的捆绑包。创建单个包的缺点是用户不可能选择删除他们不使用的功能。创建多个捆绑包的缺点是,配置变得更加繁琐,并且经常需要为各种捆绑包重复设置。
使用下面的方法,可以通过启用单个扩展来预先设置任何包,从而消除多包方法的缺点。方法中定义的设置应用程序/配置/ config.yml
预先添加设置,就好像它们是由用户在应用程序配置中显式编写的一样。
例如,这可以用于配置实体管理器名称,以便在多个捆绑包中使用。或者也可以使用它来启用依赖于正在加载的另一个bundle的可选特性。
为了给扩展提供这样做的能力,它需要实现PrependExtensionInterface:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php名称空间Acme\HelloBundle\DependencyInjection;使用ob娱乐下载\组件\HttpKernel\DependencyInjection\扩展;使用ob娱乐下载\组件\DependencyInjection\扩展\PrependExtensionInterface;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;类AcmeHelloExtension扩展扩展实现了PrependExtensionInterface{/ /……公共函数预谋(ContainerBuilder$容器){/ /……}}
在预先考虑()方法,开发人员可以完全访问ContainerBuilder实例。load ()方法在每个注册的bundle Extensions上被调用。为了将设置前置到包扩展,开发人员可以使用prependExtensionConfig ()方法。ContainerBuilder实例。类中显式完成的任何其他设置,由于此方法仅作为设置的前缀应用程序/配置/ config.yml
将覆盖这些前置设置。
下面的例子说明了如何在多个bundle中预先设置一个配置,以及在多个bundle中禁用一个标志,以防特定的其他bundle未注册:
12 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 28 29 30 31 32 33
公共函数预谋(ContainerBuilder$容器){//获取所有bundle$包=$容器->getParameter (“kernel.bundles”);//确定是否注册了acme好孩子bundle如果(!收取($包[“AcmeGoodbyeBundle”))) {//在bundle中禁用acme好孩子bundle$配置=数组(“use_acme_goodbye”= >假);foreach($容器->getExtensions ()作为$的名字= >$扩展) {开关($的名字) {情况下“acme_something”:情况下“acme_other”://在acme_something和acme_other的配置中将use_acme_goodbye设置为false//注意,如果用户手动配置use_acme_goodbye为true/ / app / config / config。Yml,那么设置最终将是真而不是假$容器->prependExtensionConfig ($的名字,$配置);打破;}}}//处理AcmeHelloExtension的配置$配置=$容器->getExtensionConfig ($这->getAlias ());//使用Configuration类生成配置数组,设置为"acme_hello"$配置=$这->processConfiguration (新配置(),$配置);//检查“acme_hello”配置中是否设置了entity_manager_name如果(收取($配置[“entity_manager_name”))) {//在acme_something设置前加上entity_manager_name$配置=数组(“entity_manager_name”= >$配置[“entity_manager_name”]);$容器->prependExtensionConfig (“acme_something”,$配置);}}
上面的内容相当于将下面的内容写入应用程序/配置/ config.yml
以防AcmeGoodbyeBundle
是没有注册和entity_manager_name
设置acme_hello
设置为non_default
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
# app / config / config.ymlacme_something:#……use_acme_goodbye:假entity_manager_name:non_defaultacme_other:#……use_acme_goodbye:假