如何简化多个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
相关文章
相关标签/搜索