當創建一個高可用和可擴展的應用程序時;開發者一般面臨者一個選擇:是建立一個大的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