2011-09-07 4 views
14

Chcę utworzyć lokalny plik konfiguracyjny, config_local.yml, który pozwala na prawidłowe skonfigurowanie środowiska programistycznego bez ryzyka zagubienia środowisk programistycznych innych osób. Chcę, aby był to osobny plik, aby móc go "odczytać" i wiedzieć, że w projekcie nie brakuje niczego istotnego, a jednocześnie nie ma problemu z gitem, który nieustannie mówi mi, że config_dev.yml ma nowe zmiany (i działa na ryzyko kogoś popełniającego te zmiany).Czy mogę dołączyć opcjonalny plik konfiguracyjny do Symfony2?

Teraz mam config_dev.yml robi

imports: 
    - { resource: config_local.yml } 

który jest wielki, chyba że plik nie istnieje (to znaczy dla nowego klon repozytorium).

Moje pytanie brzmi: czy jest jakiś sposób, aby włączyć to opcjonalnie? Oznacza to, że jeśli plik istnieje, należy go zaimportować, w przeciwnym razie go zignorować.

Edit: miałem nadzieję składni jak:

imports: 
    - { resource: config.yml } 
    ? { resource: config_local.yml } 

Odpowiedz

8

Rozwiązaniem jest utworzenie osobnego środowiska, co zostało wyjaśnione w Symfony2 cookbook. Jeśli nie chcesz go tworzyć, istnieje inny sposób obejmujący utworzenie rozszerzenia.

// src/Acme/Bundle/AcmeDemo/DepencendyInjection/AcmeDemoExtension.php 
namespace Acme\DemoBundle\DependencyInjection; 

use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\HttpKernel\DependencyInjection\Extension; 

class AcmeDemoExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     // All following files will be loaded from the configuration directory 
     // of your bundle. You may change the location to /app/ of course. 
     $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 

     try 
     { 
      $loader->load('config_local.yml'); 
     } 
     catch(\InvalidArgumentException $e) 
     { 
      // File was not found 
     } 
    } 
} 

Niektóre kopanie w kodzie Symfony ujawnił mi, że YamlFileLoader::load() FileLocator::locate() rzuci \InvalidArgumentException, jeśli plik nie został znaleziony. Jest wywoływana przez YamlFileLoader::load().

Jeśli użyjesz konwencji nazewnictwa, rozszerzenie zostanie automatycznie wykonane. Bardziej szczegółowe wyjaśnienie, visit this blog.

+1

Twoja odpowiedź pozwala mi myśleć, że może będzie mógł stworzyć swój własny "YamlFileLoader", który może zakończyć się niepowodzeniem, jeśli plik yml nie zostanie znaleziony. –

+1

Bardzo dobra odpowiedź, dzięki. Chciałbym dać +2 –

+1

@arms Tak, jest to również możliwe, ale musiałby po prostu stworzyć niestandardowy 'FileLocator' zamiast' YamlFileLoader'. Ten wyjątek zostanie zgłoszony w 'Symfony \ Component \ Config \ FileLocator :: locate', więc musimy rozszerzyć klasę podstawową, aby ładowanie zakończyło się niepowodzeniem. – gilden

16

Istnieje inna opcja.

na app/appKernel.php zmienić metodę registerContainerConfiguration do tego:

public function registerContainerConfiguration(LoaderInterface $loader) 
{ 
    $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 

    $extrafiles = array (
     __DIR__.'/config/config_local.yml', 
    ); 

    foreach ($extrafiles as $filename) { 
     if (file_exists($filename) && is_readable($filename)) { 
      $loader->load($filename); 
     } 
    } 
} 

ten sposób masz globalny plik config_local.yml że nadpisuje config_env.yml plików

+1

to jest dobry pomysł, dziękuję –

1

próbowałem obie powyższe odpowiedzi ale żadna nie zadziałała dla mnie.

  1. zrobiłem nowe środowisko: „lokalny”, która importuje „dev”, ale jak można przeczytać tutaj: There is no extension able to load the configuration for "web_profiler" miał również włamać klasę AppKernel.
    Ponadto nie można ustawić pliku config_local.yml na .gitignore, ponieważ plik jest niezbędny w lokalnym środowisku.

  2. odkąd hack AppKernel każdym razie próbowałem podejście z $ extrafiles ale to spowodowało „ForbiddenOverwriteException”

co teraz pracował dla mnie była zmiana podejścia $ extrafiles:
Zamień w aplikacji/AppKernel.php
$loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
z

if ($this->getEnvironment() == 'dev') { 
     $extrafiles = array(
      __DIR__ . '/config/config_local.yml', 
     ); 
     foreach ($extrafiles as $filename) { 
      if (file_exists($filename) && is_readable($filename)) { 
       $loader->load($filename); 
      } 
     } 
    } else { 
     $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml'); 
    } 
22

wiem, że to jest bardzo stare pytanie, a ja sądzę, zatwierdzone rozwiązanie jest lepsze myślałem dałbym prostsze rozwiązanie, które ma tę zaletę, nie zmieniając żadnego kodu

można użyć opcji ignore_errors, które nie będą wyświetlane jakieś błędy, jeśli plik nie istnieje

imports: 
    - { resource: config_local.yml, ignore_errors: true } 

Ostrzeżenie, jeśli w pliku wystąpi błąd składni, zostanie on również zignorowany, więc w przypadku nieoczekiwanych wyników sprawdź, czy plik nie zawiera błędu składni lub innego błędu.