在symfony2 parameters.yml中获取环境变量

在symfony2 parameters.yml中获取环境变量,symfony,amazon-web-services,amazon-elastic-beanstalk,Symfony,Amazon Web Services,Amazon Elastic Beanstalk,我正在尝试让我的symfony2应用程序在弹性豆茎上运行。我正在尝试在我的parameters.yml中获取环境变量(RDS\u USER、RDS\u PASSWORD等),以便获取数据库凭据。 问题是symfony2需要环境变量的前缀为SYMFONY\uuuu,这样我就可以得到这些没有前缀的变量了吗?您可以将php文件作为资源加载: # app/config/config.yml imports: - { resource: parameters.php } 从那里很容易: // a

我正在尝试让我的symfony2应用程序在弹性豆茎上运行。我正在尝试在我的parameters.yml中获取环境变量(RDS\u USER、RDS\u PASSWORD等),以便获取数据库凭据。

问题是symfony2需要环境变量的前缀为
SYMFONY\uuuu
,这样我就可以得到这些没有前缀的变量了吗?

您可以将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'));
更新: 从最初的答案开始,使用
composer.json
incenteev parameters
组件的
env-map
功能提供了一个新的解决方案(感谢您指出)

"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
的更多信息,请参见。

仅给出一个对我有效的明确示例,我在配置文件(
config.yml
)中同时使用
parameters.yml
parameters.php
):

保留
parameters.yml
my defaults并在
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'));
}

我很抱歉,因为这个问题已经得到了回答(我发现答案非常有用,谢谢@tomas.pecserke@dubrox!),但我又深入研究了一点,发现了一个我认为值得为后代添加的替代解决方案

简而言之,您可以在
composer.json
中将
env映射添加到
incenteev参数
,以将可用的环境变量映射到参数;e、 g:

"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"
        }
    }
}
如以下文件所述:

对于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

交互式提示将跳过所有
数据库*
参数,这些参数将由环境值自动填充。部署健全性。真棒:)

我可以在yml文件本身中使用getenv()吗?而不是从资源中加载它?不,你不能。要使用PHP函数,您需要包含PHP资源。很高兴有人已经问了这个问题:)这就是我如此喜欢的原因。谢谢各位。
rm app/config/parameters.yml

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

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