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

Posted

技术标签:

【中文标题】在 symfony2 parameters.yml 中获取环境变量【英文标题】:Get environment variables in symfony2 parameters.yml 【发布时间】:2013-03-02 22:51:15 【问题描述】:

我正在尝试让我的 symfony2 应用程序在弹性 beantalk 上运行。我正在尝试在我的 parameters.yml 中获取环境变量(RDS_USER、RDS_PASSWORD 等)以获取数据库凭据。 问题是 symfony2 需要以 SYMFONY__ 为前缀的环境变量,所以我可以得到这些不带前缀的变量吗?

【问题讨论】:

很高兴有人已经问过这个问题 :) 这就是我喜欢 SO 的原因。谢谢大家。 【参考方案1】:

您可以将 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.jsonincenteev-parameters 组件的env-map 功能提供了一个新的解决方案(感谢@darragh-enright 指出)。

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

【讨论】:

我可以在 yml 文件中使用 getenv() 吗?而不是从资源中加载它? 不,你不能。要使用 PHP 函数,您需要包含 PHP 资源。【参考方案2】:

我很抱歉,因为这个问题已经得到解答(我发现这些答案非常有帮助,感谢 @tomas.pecserke@dubrox!),但我挖了大约多一点,我发现了一个我认为值得为后代添加的替代解决方案。

简而言之,您可以在composer.json 中将env-map 添加到incenteev-parameters 以将可用的环境变量映射到参数;例如:

"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_* 参数,它们将由环境值自动填充。部署理智。太棒了:)

【讨论】:

【参考方案3】:

举一个对我有用的明确示例,我在我的配置文件 (config.yml) 中同时使用了 parameters.ymlparameters.php

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

如果至少找到一个 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'));

希望对你有帮助。

【讨论】:

【参考方案4】:
<?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'], '');

【讨论】:

以上是关于在 symfony2 parameters.yml 中获取环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从 symfony2 的控制器中读取 parameters.yml?

如何访问 Symfony2 中的嵌套参数值?

Heroku 上的 Symfony2 ClearDB 配置

Symfony2 中的 SECRET 参数是做啥用的?

如何解决在 aws 上打开 symfony2 安装时出现 403 Forbidden 错误?

Oro CRM 在安装期间不忽略数据库的 parameters.yml