2016-01-15 3 views
2

У меня есть приложение symfony2, для которого требуются разные настройки конфигурации для определенных сред, например. test.Почему моя конфигурация не перезаписывается для тестовой среды в symfony2?

Я перезаписать мой config.yml для тестового envioronment так:

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 I для перезаписывания значения:

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() 

Однако конфигурация не правильно перезаписаны, что делает пробный запуск неудачу.

Что здесь происходит? Я успешно переписал другие записи конфигурации, используя эту стратегию.

+0

Интересно, почему вы делаете Еогеасп и чеки в AppKernel вместо использования расширения инъекции зависимостей. – malcolm

+0

@malcolm Легкий ответ: это наследие ^^ Поэтому я не могу назвать причину, почему это было сделано так. Не могли бы вы указать на пример того, что вы имеете в виду? – k0pernikus

+0

Я имею в виду класс расширения в инъекции зависимостей в собственном пакете, если вы выполняете 'processConfiguration' в методе' load', у вас есть конфигурация вашего пакета, зависящая от фактической среды. http://symfony.com/doc/current/cookbook/bundles/configuration.html#processing-the-configs-array – malcolm

ответ

1

При сравнении default_airports в файлах для каждой среды:

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

массив потерял свой ключ, вместо ожидаемого

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

была 0-индексированный массив.

Так соответствующая часть ConfigTreeBuilder в Configuration.php должен выглядеть следующим образом:

->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() 
Смежные вопросы