2013-03-14 1 views
16

Ich versuche, meine symfony2 App auf elastischen Bohnenstange laufen zu lassen. Ich versuche, Umgebungsvariablen (RDS_USER, RDS_PASSWORD, etc ...) in meine paramters.yml zu bekommen, um die Datenbankanmeldeinformationen zu bekommen.
Die Sache ist Symfony2 benötigt die Umgebungsvariablen, die SYMFONY__ vorangestellt werden, damit ich diese Variablen ohne Präfixe bekommen könnte?Holen Sie Umgebungsvariablen in symfony2 parameter.yml

+0

so froh, dass jemand diese Frage schon gestellt hat :) deshalb liebe ich SO. danke Leute. –

Antwort

27

Sie können eine PHP-Datei als Ressource laden:

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

Und von dort ist es einfach:

// 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: Da die ursprüngliche Antwort, eine neue Lösung wurde zur Verfügung gestellt (Danke an @darragh-enright für den Hinweis) mit env-map Feature von incenteev-parameters Komponente in 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" 
     } 
    } 
} 

Alle zugeordneten Parameter werden durch den Wert aus der Umgebungsvariablen überschrieben. Für weitere Informationen über env-map siehe documentation.

+0

kann ich getenv() in der Yml-Datei selbst verwenden? anstatt es von einer Ressource zu laden? – kapitanluffy

+0

Nein, das geht nicht. Um PHP-Funktionen nutzen zu können, müssen Sie PHP-Ressourcen einbinden. –

9

Nur ein explizites Beispiel zu geben, die für mich arbeiten, ich verwende sowohl die parameters.yml und parameters.php in meiner Konfigurationsdatei (config.yml):

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

Keeping in parameters.yml meine Vorgaben und einige von ihnen zu überschreiben in parameters.php, wenn mindestens ein RDS-Umgebungsvariable gefunden wird:

<?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')); 
} 

Hoffe, es hilft.

12

Ich entschuldige mich, weil diese Frage bereits beantwortet wurde (und ich fand die Antworten sehr hilfreich, dank @ tomas.pecserke und @dubrox!), Aber ich um ein wenig mehr gegraben und entdeckte ich eine Alternative Lösung, die ich denke, ist es wert für die Nachwelt hinzuzufügen.

Kurz gesagt, können Sie env-map zu incenteev-parameters in composer.json hinzufügen, um verfügbare Umgebungsvariablen zu Parametern zuzuordnen; z:

"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" 
     } 
    } 
} 

Wie in Using environment variables to set the parameters dokumentiert:

Für Ihre prod Umgebung, eine interaktive Aufforderung nicht möglich sein kann, bei der Bereitstellung. In diesem Fall können Sie sich auf Umgebungsvariablen verlassen, um die Parameter bereitzustellen. Dies wird erreicht, indem eine Karte zwischen Umgebungsvariablen bereitstellt und die Parameter, die sie füllen sollte [...]

und

Wenn eine Umgebungsvariable gesetzt ist, wird dessen Wert immer den Wert ersetzen gesetzt in die vorhandene Parameterdatei.

Ich habe es gerade auf einer neuen EB-Bereitstellung getestet und es hat ein Vergnügen gemacht. Sie können dies testen mit einem lokalen Einsatz, etwa so:

rm app/config/parameters.yml 

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

composer install 

Die interaktive Eingabeaufforderung werden alle database_* Parameter überspringen, und sie werden durch die Umweltwerte automatisch ausgefüllt werden. Deployment Vernunft. Genial :)

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'], '');