如何簡化多個Bundle的配置

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