如何简化配置多个包

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何简化配置多个包

在构建可重用和可扩展的应用程序时,开发人员常常面临着一个选择:要么创建一个大型包或多个更小的包。创建一个包有缺点,是不可能的用户删除未使用的功能。创建多个包的缺点是配置变得更加乏味和设置为各种包通常需要重复。

可以删除的缺点多个包的方法通过启用一个扩展预先考虑设置任何包。它可以使用设置中定义配置/ *文件预先考虑设置就好像他们已经书面明确用户在应用程序中配置。

例如,这可能是用于配置实体管理器名称使用在多个包。也可以被用来支持一个可选的特性,取决于另一个包被加载。

给一个扩展的权力这样做,它需要实现PrependExtensionInterface:

1 2 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 ()方法在每个注册包的扩展。为了预先考虑设置一捆扩展开发者可以使用prependExtensionConfig ()方法ContainerBuilder实例。这个方法只突出显示设置,其他设置明确内部完成的配置/ *文件会覆盖这些前缀设置。

下面的例子说明了如何预谋配置设置在多个包以及禁用标志在多个包在一个特定的其他包不是注册:

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 28 29 30 31 32 33 34 35 36 37 38 39
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php公共函数预谋(ContainerBuilder美元容器){/ /得到所有包美元=美元容器- >getParameter (“kernel.bundles”);/ /判断AcmeGoodbyeBundle登记如果(!收取(美元(“AcmeGoodbyeBundle”))){/ /禁用AcmeGoodbyeBundle包美元配置= (“use_acme_goodbye”= >];foreach(美元容器- >getExtensions ()作为美元的名字= >美元扩展){开关(美元的名字){情况下“acme_something”:情况下“acme_other”:/ /设置use_acme_goodbye错误的配置/ / acme_something acme_other/ // /注意,如果用户手动配置/ / use_acme_goodbye如此配置/ services.yaml/ /设置会最终是真实的而不是虚假的美元容器- >prependExtensionConfig (美元的名字,美元配置);打破;}}}/ /得到AcmeHelloExtension的配置(这是一个列表的配置)美元配置=美元容器- >getExtensionConfig (美元- >getAlias ());/ /遍历反过来将配置后保存原始订单foreach(array_reverse (美元配置)作为美元配置){/ /检查是否entity_manager_name“acme_hello”中设置配置如果(收取(美元配置(“entity_manager_name”))){/ /预谋entity_manager_name acme_something设置美元容器- >prependExtensionConfig (“acme_something”,(“entity_manager_name”= >美元配置(“entity_manager_name”)));}}}

上述相当于写以下的配置/包/ acme_something.yaml以防AcmeGoodbyeBundle不是注册的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:

使用PrependExtensionInterface超过一个包

如果有多个包加相同的扩展和定义相同的键,注册的包第一个接下来会优先:包不会覆盖这个特定的配置设置。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。