2015-01-15 21 views
5

Próbuję użyć ENVs, aby ustawić moje parametry w Symfony2. Wartości skalarne są dość łatwe, ale mam parametry, które są tablicami, które muszę ustawić w jakiś sposób z ENV.Nieskalarne ENV do użycia jako parametr Symfony

Parametr w pytaniu:

parameters: 
    redis.servers: 
    - { host: 127.0.0.1, port: 6379 } 
    - { host: other, port: 6379 } 
    # and so on 

Kicker jest to, że tablica serwerów można zmieniać dynamicznie, więc nie można po prostu założyć tam 2.

Co miałem nadzieję zrobić (ale to tylko daje mi ciąg jsonów):

SYMFONY__REDIS__SERVERS=[{"host":"127.0.0.1","port":"6379"}] 

Czy to możliwe? Jakiekolwiek obejścia, które są możliwe? Istnieje wiele pakietów, z których korzystamy, które akceptują parametry tablicy/obiektu, więc nie mogę wykonać tam aktualizacji, aby przetworzyć ten parametr. Musiałby to być poziom aplikacji, jeśli w ogóle.

Dzięki.

Odpowiedz

1

Byłem w stanie rozwiązać ten problem, aktualizując AppKernel, aby nadpisać metodę getEnvParameters() nadrzędnego jądra. Ta metoda działa tylko na parametrach, które Kernel już znalazł w ENV (technicznie od $ _SERVER). Podoba mi się, ponieważ nie będzie działać na całym stosie parametrów ani na całej tablicy $ _SERVER.

protected function getEnvParameters() 
{ 
    $parameters = parent::getEnvParameters(); 
    foreach ($parameters as &$parameter) { 
     if (is_string($parameter)) { 
      $decoded = json_decode($parameter, true); 
      // we only care about arrays (or objects that get turned into arrays) 
      if (!json_last_error() && is_array($decoded)) { 
       $parameter = $decoded; 
      } 
     } 
    } 

    return $parameters; 
}