如何从捆绑包的本地配置文件中添加全局配置?

时间:2015-11-08 17:45:02

标签: symfony

我有一个应用程序,其中业务逻辑被拆分为捆绑包,以便于管理和扩展。每个捆绑包提供其实体,服务,模板(如果是UI捆绑包)等。

实体应注册到ORM以参与./bin/console doctrine:schema:update等命令。

我正在为我的捆绑包使用自定义文件夹结构,因此每个捆绑包中没有任何根Entity文件夹。所以,我必须使用doctrine.orm.mappings配置密钥注册实体。

我希望每个bundle都能自己注册它们的实体,而不需要将它们引用到全局配置中。

所以,我在每个捆绑包中使用PrependExtensionInterface。我的prepend()方法如下所示:

/**
 * Allow an extension to prepend the extension configurations.
 *
 * @param ContainerBuilder $container
 */
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);
    }
}

我的.yml看起来像这样:

doctrine:
  orm:
      mappings:
          thiris_cart_logic_auth_user:
              type: annotation
              dir: %kernel.root_dir%/../src/ThirisCart/Logic/AuthBundle/User/Model
              alias: Category
              prefix: ThirisCart\Logic\AuthBundle\User\Model
              is_bundle: false

除了一件事,它的效果非常好。 看起来,就像我从.yml读取的配置一样,没有验证其正确性。它只是在没有进一步问题的情况下合并到全局配置中。

那么,问题是如何验证呢?

1 个答案:

答案 0 :(得分:0)

我通过查看Symfony来源找到了答案。

如果您查看Symfony\Component\DependencyInjection\Compiler\PassConfig::__construct,您会看到,第一次传递是MergeExtensionConfigurationPass,其中prepend()被调用。因此,附加配置将得到验证。

但请注意,Symfony会缓存配置。如果您在prepend()方法中更改了代码,则还必须touch()部分配置文件,或者只是使配置缓存无效以使更改生效。