【问题标题】:Why isn't my configuraton overwritten for the test environment in symfony2?为什么我的配置没有覆盖 symfony2 中的测试环境?
【发布时间】:2016-01-15 13:44:43
【问题描述】:

我有一个 symfony2 应用程序,它需要针对某些环境进行不同的配置设置,例如test.

我为测试环境覆盖我的 config.yml,如下所示:

AppKernel.php:

public function registerContainerConfiguration(LoaderInterface $loader)
{
    foreach ($this->getBundles() as $bundle) {
        if (false === strpos($bundle->getName(), 'Dreamlines')) {
            continue;
        }
        $configFile = $bundle->getPath() . '/Resources/config/config.yml';
        if (!file_exists($configFile)) {
            continue;
        }
        $loader->load($configFile);
    }

    $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
}

在我的config.yml 我定义:

default_airports:
    cun:
        de:
            - FRA

在我的 config_test.yml 中,我定义了以下内容来覆盖该值:

default_airports:
    cun:
        de:
            - HAM

我的 ConfigTreeBuilder 寻找的配置看起来像

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder
->root('le_bundle');

    $rootNode
    ...
    ->arrayNode('default_airports')
       ->isRequired()
       ->requiresAtLeastOneElement()
        ->useAttributeAsKey('name')
        ->prototype('array')
            ->prototype('array')
                ->prototype('scalar')->end()
            ->end()
        ->end()
    ->end()

然而配置没有被正确覆盖,导致测试运行失败。

这里发生了什么?我已经使用此策略成功重写了其他配置条目。

【问题讨论】:

  • 我想知道你为什么要执行 foreach 并检查 AppKernel 而不是使用依赖注入扩展。
  • @malcolm 简单的回答:这是遗留问题 ^^ 所以我无法说出这样做的原因。你能举个例子来说明你的意思吗?
  • 我的意思是依赖注入中的扩展类在自己的包中,如果你在load方法中做processConfiguration,你的包配置依赖于实际环境。 symfony.com/doc/current/cookbook/bundles/…

标签: php symfony configuration


【解决方案1】:

比较每个环境文件中的default_airports 时:

  • app/cache/dev/appDevDebugProjectContainer.php
  • app/cache/test/appTestDebugProjectContainer.php

数组丢失了它的键,而不是预期的

`de` => arrray(0 => 'HAM')

有一个索引为 0 的数组。

所以Configuration.phpConfigTreeBuilder 的相关部分必须如下所示:

->arrayNode('default_airports')
   ->isRequired()
   ->requiresAtLeastOneElement()
    ->useAttributeAsKey('name')
    ->prototype('array')
        ->useAttributeAsKey('name') // FIXES LOST KEY IN CONFIG FOR TEST ENV
        ->prototype('array')
            ->useAttributeAsKey('name')
            ->prototype('scalar')->end()
        ->end()
    ->end()
->end()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 2016-01-12
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多