当创建一个高可用和可扩展的应用程序时;开发者一般面临者一个选择:是建立一个大的Bundle仍是建立多个小的Bundle;建立单个大的Bundle的缺点是可能程序存在咱们不少不用的功能;多个小的Bundle的缺点就是配置很繁琐;api
例如,咱们可能想要多个Bundle用一个实体管理名称配置或开启禁用一个Bundle取决于该是否注册加载app
class Test3Extension extends Extension implements PrependExtensionInterface { /** * Loads a specific configuration. * * @param array $config An array of configuration values * @param ContainerBuilder $container A ContainerBuilder instance * * @throws \InvalidArgumentException When provided tag is not defined in this extension * * @api */ public function load(array $config, ContainerBuilder $container) { var_dump($config); } /** * Allow an extension to prepend the extension configurations. * * @param ContainerBuilder $container */ public function prepend(ContainerBuilder $container) { //获取全部bundle; $bundles = $container->getParameter('kernel.bundles'); //判断某个Bundle是否注册 if (!isset($bundles['AppssBundle'])) { $config = array('use_app' => false); foreach ($container->getExtensions() as $name => $extension) { switch ($name) { case 'acme_something': case 'acme_other': //把配置加入到其余的Bundle中 $container->prependExtensionConfig($name, $config); break; } } } //处理本身的配置; $configs = $container->getExtensionConfig($this->getAlias()); //合并验证; $config = $this->processConfiguration(new Configuration(), $configs); // 检测entity_manager_name选项是否配置 if (isset($config['entity_manager_name'])) { //给acme_something Bundle的entity_manager_name选项设置同样的配置; $config = array('entity_manager_name' => $config['entity_manager_name']); $container->prependExtensionConfig('acme_something', $config); } } public function getAlias() { return 'test'; } }
上面的配置等同于在app/config/config.yml中的配置ide
# app/config/config.yml acme_something: # ... use_app: false entity_manager_name: non_default acme_other: # ... use_app: false