如何简化多个bundle的配置
编辑本页如何简化多个bundle的配置
在构建可重用和可扩展的应用程序时,开发人员经常面临一个选择:创建一个大型捆绑包或多个较小的捆绑包。创建单个bundle的缺点是用户不可能删除未使用的功能。创建多个捆绑包的缺点是,配置变得更加繁琐,并且经常需要为各种捆绑包重复设置。
通过启用单个扩展来预先设置任何包,可以消除多包方法的缺点。方法中定义的设置配置/ *
设置前的文件,就好像它们是由用户在应用程序配置中显式编写的一样。
例如,这可以用于配置实体管理器名称,以便在多个捆绑包中使用。或者也可以使用它来启用依赖于正在加载的另一个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娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\扩展\PrependExtensionInterface;使用ob娱乐下载\组件\HttpKernel\DependencyInjection\扩展;类AcmeHelloExtension扩展扩展实现了PrependExtensionInterface{/ /……公共函数预谋(ContainerBuilder$容器){/ /……}}
在预先考虑()方法,开发人员可以完全访问ContainerBuilder实例。load ()方法在每个注册的bundle Extensions上被调用。为了将设置前置到包扩展,开发人员可以使用prependExtensionConfig ()方法。ContainerBuilder实例。类中显式完成的任何其他设置,由于此方法仅作为设置的前缀配置/ *
文件将覆盖这些前置设置。
下面的例子说明了如何在多个bundle中预先设置一个配置,以及在多个bundle中禁用一个标志,以防特定的其他bundle未注册:
12 34 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 34 35 36 37
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php公共函数预谋(ContainerBuilder$容器){//获取所有bundle$包=$容器->getParameter (“kernel.bundles”);//确定是否注册了acme好孩子bundle如果(!收取($包[“AcmeGoodbyeBundle”))) {//在bundle中禁用acme好孩子bundle$配置= (“use_acme_goodbye”= >假];foreach($容器->getExtensions ()作为$的名字= >$扩展){匹配($的名字){//在config中将use_acme_goodbye设置为false// acme_something和acme_other////注意如果用户手动配置// use_acme_goodbye在config/services.yaml中设置为true//那么该设置最终将为真而不是假“acme_something”,“acme_other”= >$容器->prependExtensionConfig ($的名字,$配置),默认的= >零};}}//获取AcmeHelloExtension的配置(这是一个配置列表)$配置=$容器->getExtensionConfig ($这->getAlias ());//反向迭代以保留配置前的原始顺序foreach(array_reverse ($配置)作为$配置){//检查“acme_hello”配置中是否设置了entity_manager_name如果(收取($配置[“entity_manager_name”))) {//在acme_something设置前加上entity_manager_name$容器->prependExtensionConfig (“acme_something”, (“entity_manager_name”= >$配置[“entity_manager_name”)));}}}
上面的内容相当于将下面的内容写入配置/包/ acme_something.yaml
如果acme好孩子bundle没有注册entity_manager_name
设置acme_hello
设置为non_default
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
#配置/包/ acme_something.yamlacme_something:#……use_acme_goodbye:假entity_manager_name:non_defaultacme_other:#……use_acme_goodbye:假
在Bundle类中预挂扩展
6.1
的AbstractBundle
类在Symfony 6.1中引入。ob娱乐下载
类的扩展,也可以直接在Bundle类中追加或预置扩展配置AbstractBundle类,并定义prependExtension ()方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\加载程序\配置器\ContainerConfigurator;使用ob娱乐下载\组件\HttpKernel\包\AbstractBundle;类FooBundle扩展AbstractBundle{公共函数prependExtension(ContainerConfigurator$容器, ContainerBuilder$构建器):无效{/ /预谋$构建器->prependExtensionConfig (“框架”, (“缓存”= > [“prefix_seed”= >“foo / bar”)));/ /添加$容器->扩展(“框架”, (“缓存”= > [“prefix_seed”= >“foo / bar”)));//从文件中追加$容器->导入(“. . / config /包/ cache.php”);}}
请注意
的prependExtension ()
方法,如预先考虑()
,只在编译时调用。
使用PrependExtensionInterface的多个Bundle
如果有多个bundle前缀相同的扩展名并定义了相同的键,则注册的是该bundle第一个优先级:next bundles不会覆盖这个特定的配置设置。