2013-03-14 11 views
16

Próbuję uruchomić moją aplikację symfony2 na elastycznej fasoli. Próbuję uzyskać zmienne środowiskowe (RDS_USER, RDS_PASSWORD, etc ...) w moim parameters.yml, aby uzyskać referencje bazy danych.
Chodzi o to, że symfony2 potrzebuje zmiennych środowiskowych, które mają być poprzedzone prefiksem przez SYMFONY__, więc mogłem uzyskać te zmienne bez prefiksów?Pobierz zmienne środowiskowe w pliku symfony2 parameters.yml

+0

Cieszę się, że ktoś już zadał to pytanie :) właśnie dlatego uwielbiam SO. dzięki chłopaki. –

Odpowiedz

27

można załadować pliku php jako zasób:

# app/config/config.yml 
imports: 
    - { resource: parameters.php } 

A stamtąd to proste:

// app/config/parameters.php 
$container->setParameter('rds.user', getenv('RDS_USER')); 
// if set via apache SetEnv use: 
//$container->setParameter('rds.user', apache_getenv('RDS_USER')); 

UPDATE: Od oryginalnej odpowiedzi, nowe rozwiązanie zostało przewidziane (dzięki @darragh-enright za wskazanie) przy użyciu funkcji env-map komponentu incenteev-parameters w composer.json.

"extra": { 
    "incenteev-parameters": { 
    "file": "app/config/parameters.yml", 
     "env-map": { 
      "database_host": "RDS_HOSTNAME", 
      "database_port": "RDS_PORT", 
      "database_name": "RDS_DB_NAME", 
      "database_user": "RDS_USERNAME", 
      "database_pass": "RDS_PASSWORD" 
     } 
    } 
} 

Każdy odwzorowany parametr zostanie zastąpiony wartością ze zmiennej środowiskowej. Aby uzyskać więcej informacji na temat env-map, zobacz documentation.

+0

Czy mogę użyć getenv() w samym pliku yml? zamiast ładować go z zasobu? – kapitanluffy

+0

Nie, nie możesz. Aby korzystać z funkcji PHP, musisz dołączyć zasoby PHP. –

9

Wystarczy dać wyraźny przykład, że pracuje dla mnie, używam zarówno parameters.yml i parameters.php w moim pliku konfiguracyjnym (config.yml):

# app/config/config.yml 
imports: 
    - { resource: parameters.yml } 
    - { resource: parameters.php } 

utrzymywanie parameters.yml moje domyślne i nadpisanie niektóre z nich w parameters.php jeśli przynajmniej zmienna RDS znaleziono:

<?php 
// app/config/parameters.php 
if(getenv('RDS_HOSTNAME'))) { 
    $container->setParameter('database_host', getenv('RDS_HOSTNAME')); 
    $container->setParameter('database_port', getenv('RDS_PORT')); 
    $container->setParameter('database_name', getenv('RDS_DB_NAME')); 
    $container->setParameter('database_user', getenv('RDS_USERNAME')); 
    $container->setParameter('database_password', getenv('RDS_PASSWORD')); 
} 

Nadzieję, że to pomaga.

12

Moje przeprosiny, ponieważ kwestia ta została już odpowiedział (i znalazłem odpowiedź bardzo pomocny, thanks @ tomas.pecserke i @dubrox!), Ale wykopali wokół trochę więcej i odkryłem alternatywę rozwiązanie, które moim zdaniem warto dodać dla potomności.

W skrócie można dodać env-map do incenteev-parameters w composer.json, aby zmapować dostępne zmienne środowiskowe do parametrów; np:

"extra": { 
    "incenteev-parameters": { 
     "file": "app/config/parameters.yml", 
     "env-map": { 
      "database_host": "RDS_HOSTNAME", 
      "database_port": "RDS_PORT", 
      "database_name": "RDS_DB_NAME", 
      "database_user": "RDS_USERNAME", 
      "database_pass": "RDS_PASSWORD" 
     } 
    } 
} 

Jak udokumentowano w Using environment variables to set the parameters:

Na swoim środowisku produkcyjnym, wykorzystując interaktywny wiersz może nie być możliwe podczas wdrażania. W takim przypadku można polegać na zmiennych środowiskowych w celu zapewnienia parametrów. Osiąga się to poprzez zapewnienie mapę między zmiennymi środowiska i parametrów powinni wypełnić [...]

i

Jeśli zmienna jest ustawiona, to jej wartość będzie zawsze zastąpi wartość ustawioną w istniejący plik parametrów.

Właśnie przetestowałem to na nowym wdrożeniu EB i zadziałało. Można to sprawdzić za pomocą lokalnego rozmieszczenia, tak:

rm app/config/parameters.yml 

export RDS_HOSTNAME=foo \ 
     RDS_PORT=3306 \ 
     RDS_DB_NAME=bar \ 
     RDS_USERNAME=baz \ 
     RDS_PASSWORD=quux 

composer install 

Interaktywny szybka pominie wszystkie parametry database_*, a zostaną one automatycznie wypełniane przez wartości środowiskowych. Wdrożenie. Awesome :)

1
<?php 
    // app/config/parameters.php 
    function setParameter($container, $paramName, array $options, $default = null) { 
     foreach ($options as $o) { 
      if (is_string(getenv($o))) { 
       $container->setParameter($paramName, getenv($o)); 
       return; 
      } 
     } 

     if (! is_null($default)) { 
      $container->setParameter($paramName, $default); 
     } 
    } 

    setParameter($container, 'database.name', ['RDS_DB_NAME', 'SYMFONY__DATABASE__NAME'], 'DEFAULT'); 
    setParameter($container, 'database.port', ['RDS_PORT', 'SYMFONY__DATABASE__PORT'], '3306'); 
    setParameter($container, 'database.host', ['RDS_HOSTNAME', 'SYMFONY__DATABASE__HOST'], '127.0.0.1'); 
    setParameter($container, 'database.user', ['RDS_USERNAME', 'SYMFONY__DATABASE__USER'], 'root'); 
    setParameter($container, 'database.password', ['RDS_PASSWORD', 'SYMFONY__DATABASE__password'], ''); 
Powiązane problemy