【问题标题】:Symfony override configuration from the app/config.ymlSymfony 覆盖 app/config.yml 中的配置
【发布时间】:2013-06-27 08:39:50
【问题描述】:

我的app/config.yml 中有这个:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

现在我创建了我的包,我希望它覆盖其中的一些配置:

doctrine:
    orm:
        resolve_target_entities:
              Acme\UserBundle\Interfaces\User: Acme\MyBundle\Entity\User

我想在不改变app/config.yml的情况下添加这个配置

【问题讨论】:

  • 你为什么想要那个?
  • 允许捆绑包在没有用户额外配置的情况下工作。 (在这种情况下,用户不需要更改配置,他不需要知道任何东西 - 捆绑包本身配置了一切。用户只安装捆绑包并使用它。)
  • 那你为什么要使用 resolve_target_entities ?这样做是为了允许最终用户自定义依赖项。
  • 顺便说一句,您可以使用编译器通道操作此配置。
  • 或:通过操作学说类元数据。

标签: symfony configuration doctrine


【解决方案1】:

我通过添加编译器通道找到了解决方案:

class OrmResolverCompilerPass implements CompilerPassInterface
{

    public function process(ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../../Resources/config'));
        $loader->load('orm.yml');

        $def = $container->findDefinition('doctrine.orm.listeners.resolve_target_entity');
        foreach ($container->getParameter('resolve_target_entities') as $name => $implementation) {
            $def->addMethodCall('addResolveTargetEntity', array( $name, $implementation, array() ));
        }
        $def->addTag('doctrine.event_listener', array('event' => 'loadClassMetadata'));
    }

}

我们还需要在 Bundle 内的Resources/config 目录中创建orm.yml

最后在controllerBundle类中注册编译器:

class MyAcmeBundle extends Bundle
{

    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $container->addCompilerPass(new OrmResolverCompilerPass());
    }

}

【讨论】:

    【解决方案2】:

    您现在可以为此使用PrependExtensionInterface

    class ThirisCartLogicCatalogExtension extends Extension implements PrependExtensionInterface
    {    
        public function prepend(ContainerBuilder $container)
        {
            $config = Yaml::parse(file_get_contents(__DIR__.'/../Resources/config/config.yml'));
    
            foreach ($config as $key => $configuration) {
                $container->prependExtensionConfig($key, $configuration);
            }
        }
    }
    

    使用此代码,您的包中的 config.yml 将无条件合并到全局配置中。

    请注意,您以这种方式加载is not validated for syntax的配置文件。

    【讨论】:

    • 对我来说这个函数没有被执行。为了实现这一目标,还有其他事情要做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多