2013-03-14 12 views
16

私は弾力のあるbeanstalkでsymfony2アプリケーションを実行しようとしています。私は、データベース資格情報を取得するために、私のparameters.ymlに環境変数(RDS_USER、RDS_PASSWORDなど)を取得しようとしています。
環境変数symfony2は接頭辞がSYMFONY__である必要があります。接頭辞なしでこれらの変数を取得できますか?symfony2のparameters.ymlで環境変数を取得

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

そしてそこから、それは簡単です:

// 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

+0

誰もがこの質問をしてくれてうれしいです:)これが私が大好きな理由です。みんなありがとう。 –

答えて

27

あなたはリソースとしてPHPファイルを読み込むことができ オリジナルの答え以来、新しいソリューションが提供されました(それを指摘するために@darragh-enrightのおかげで)のenv-mapの機能を使用して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" 
     } 
    } 
} 

マップされたパラメータは、環境変数の値によって上書きされます。 env-mapの詳細については、documentationを参照してください。

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

parameters.yml私のデフォルト値に維持し、そのうちのいくつかを上書き:ちょうど私のために働いている明示的な例を与えるために、私は私の設定ファイル(config.yml)でparameters.ymlparameters.phpの両方を使用してい

+0

ymlファイル自体にgetenv()を使用できますか?それをリソースからロードするのではなく? – kapitanluffy

+0

いいえ、できません。 PHP関数を使用するには、PHPリソースをインクルードする必要があります。 –

9

少なくともRDS環境変数が見つかった場合parameters.phpに:

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

はそれがお役に立てば幸いです。

12

私の謝罪、この質問が既に回答されている(と私は答えが非常に役に立った、感謝@@dubrox tomas.pecserke!)ので、私はもう少し周りを掘って、私は選択肢を発見後世のために追加する価値があると思うソリューションです。

簡潔に言えば、env-mapincenteev-parametersを追加して、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" 
     } 
    } 
} 

Using environment variables to set the parametersに記載したよう:展開するときに、あなたのprod環境のために

、対話プロンプトを使用することはできない場合があります。この場合、環境変数を使用してパラメータを提供することができます。これは、環境変数が設定されている場合は、[...]

を環境変数と、彼らが記入すべきパラメータの間のマップを提供することによって達成され、その値は常にに設定された値に置き換えられます既存のパラメータファイル。

私はちょうど新鮮なEBの配置でこれをテストし、それは治療を働いた。あなたはそうのように、ローカルの展開でこれをテストすることができます。

rm app/config/parameters.yml 

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

composer install 

対話プロンプトがすべてdatabase_*のパラメータをスキップします、そして、彼らは自動的に環境価値によって取り込まれます。展開の健全性。恐ろしい:)

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