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

art*_*rou 17 amazon-web-services symfony amazon-elastic-beanstalk

我正在尝试让我的symfony2应用程序在弹性beanstalk上运行.我正在尝试在我的parameters.yml中获取环境变量(RDS_USER,RDS_PASSWORD等...)以获取数据库凭据.
事情是symfony2需要环境变量作为前缀,SYMFONY__所以我可以得到没有前缀的这些变量?

tom*_*rke 29

您可以将php文件作为资源加载:

# app/config/config.yml
imports:
    - { resource: parameters.php }
Run Code Online (Sandbox Code Playgroud)

从那里很容易:

// 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'));
Run Code Online (Sandbox Code Playgroud)

更新:从原始答案开始,使用组件的功能提供了一个新的解决方案(感谢@ darragh-enright指出它).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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何映射的参数都将被环境变量中的值覆盖.有关详细信息,env-map请参阅文档.


Dar*_*ght 13

我很抱歉,因为这个问题已经得到了解答(我发现答案非常有用,感谢@ tomas.pecserke@dubrox!),但是我挖了一点,我发现了另一种我认为值得添加的解决方案后人.

简而言之,您可以添加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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用环境变量设置参数中所述:

对于您的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
Run Code Online (Sandbox Code Playgroud)

交互式提示将跳过所有database_*参数,它们将由环境值自动填充.部署理智.太棒了:)


dub*_*rox 9

只是给出一个适合我的明确示例,我在配置文件中使用了parameters.ymlparameters.php(config.yml):

# app/config/config.yml
imports:
    - { resource: parameters.yml }
    - { resource: parameters.php }
Run Code Online (Sandbox Code Playgroud)

如果找到至少一个RDS环境变量,保持parameters.yml我的默认值并覆盖其中一些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'));
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.