19

symfony2アプリをelasticbeanstalkで実行しようとしています。データベースのクレデンシャルを取得するために、parameters.ymlで環境変数(RDS_USER、RDS_PASSWORDなど)を取得しようとしています。
symfony2は環境変数にプレフィックスを付ける必要があるSYMFONY__ので、プレフィックスなしでこれらの変数を取得できますか?

4

4 に答える 4

30

phpファイルをリソースとしてロードできます。

# 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'));

更新:元の回答以来、のコンポーネントの機能を使用して、新しいソリューションが提供されました(@ darragh-それを指摘してくれたおかげで)。env-mapincenteev-parameterscomposer.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を参照してください。

于 2013-03-14T20:21:24.720 に答える
14

この質問はすでに回答されているので、お詫びします(@ tomas.pecserke@dubroxに感謝します!)が、もう少し掘り下げて、追加する価値があると思う代替ソリューションを見つけました。後世。

簡単に言うと、env-maptoを追加してincenteev-parameterscomposer.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"
        }
    }
}

環境変数を使用してパラメータを設定するに記載されているように:

本番環境では、デプロイ時にインタラクティブプロンプトを使用できない場合があります。この場合、パラメータを提供するために環境変数に依存することができます。これは、環境変数とそれらが満たす必要のあるパラメーターの間のマップを提供することによって実現されます[...]

環境変数が設定されている場合、その値は常に既存のパラメータファイルに設定されている値に置き換わります。

私はこれを新しい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_*し、環境値によって自動的に入力されます。展開の健全性。素晴らしい :)

于 2015-07-08T14:52:39.057 に答える
9

私のために働いている明確な例を与えるために、私は構成ファイル( )でparameters.ymlとの両方を使用しています:parameters.phpconfig.yml

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

parameters.ymlデフォルトを維持し、parameters.php少なくともRDS環境変数が見つかった場合は、それらの一部を上書きします。

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

それが役に立てば幸い。

于 2014-10-24T15:34:20.387 に答える
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'], '');
于 2015-10-16T05:00:04.237 に答える