2011-12-23 12 views
6

Nie mogę uzyskać konfiguracji symfony2, aby poprawnie nadpisać wartości z innych plików konfiguracyjnych. Tutaj jest problem:symfony2 yaml: nadpisanie konfiguracji

Mam nowe środowisko "inscenizacji", w którym chcę użyć większości rzeczy z config_prod.yml, ale mam inny poziom logowania (chcę, aby był taki jak jest w fazie rozwoju, po prostu rejestruje wszystko do pliku). Oto rzeczy config używam:

config_prod.yml:

imports: 
    - { resource: config.yml } 

monolog: 
    handlers: 
     main: 
      type: fingers_crossed 
      action_level: error 
      handler: nested 
     nested: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 

config_staging.yml:

imports: 
    - { resource: config_prod.yml } 

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
     nested: ~ 

Z mojego punktu widzenia, zagnieżdżone rejestrator jest teraz nieważne i główne dzienniki do podanego pliku. To, co naprawdę się dzieje, to to, że rejestruje każdą wiadomość dwa razy! To samo dzieje się, gdy używam tego dla config_staging.yml:

imports: 
    - { resource: config_prod.yml } 

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
      handler: ~ 
     nested: ~ 

znalazłem obejście, ustawienie action_level głównego przewodnika do debugowania i pozostawiając wszystko inne, jak jest, ale nie podoba mi się to rozwiązanie . Musi istnieć sposób nadpisania plików konfiguracyjnych, więc mam tylko główny program obsługi monologu.

Odpowiedz

8

Prawie rok później mam teraz zrozumienie tego, co się dzieje i jak temu zapobiec:

Handler nested jest befilled z konfiguracją z config.yml i podczas parsowania config_staging.yml składnik yaml nie nadpisuje cała niedziałająca wartość i ustawia wartość na zero, ale próbuje połączyć oba, dając w wyniku taką samą tablicę jak poprzednio.

Istnieje typ o nazwie null, którego można użyć do zastąpienia dowolnego rejestratora. To nic nie robi i jest dla nich odpowiednia dla tego przypadku użycia:

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
      handler: ~ 
     nested: ~ 
      type: null 

Innym rozwiązaniem byłoby nie skonfigurować dowolny rejestrowania w config.yml ale tylko w określonym środowisku configs jak config_prod.yml i tak dalej.

1

Sprawdź, czy nie masz żadnych powtarzających się kluczy w pliku konfiguracyjnym _staging - drugi zastąpi pierwszy, a wynik netto, że pierwszy jest ignorowany.

+0

Sprawdziłem ten, nie ma tam dublowanych kluczy! – Sgoettschkes

0

Jeśli chcesz zmienić kolekcję poprzez usunięcie elementu, musisz utworzyć pośredni plik YAML (zaimportowanie bazy) ustawiając kolekcję na "null" i ponownie dodając wszystkie wymagane elementy kolekcji do pliku, który z kolei importuje pośredni plik YAML.

Nie można po prostu zastąpić kolekcji. Nowe elementy zostaną dodane, ale nie można usunąć istniejących, z wyjątkiem opisanego obejścia.