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

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

【问题讨论】:

  • 很高兴有人已经问过这个问题 :) 这就是我喜欢 SO 的原因。谢谢大家。

标签: symfony amazon-web-services amazon-elastic-beanstalk


【解决方案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'], '');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-24
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 2017-02-19
        • 2013-11-01
        • 1970-01-01
        相关资源
        最近更新 更多