2013-03-14 11 views
16

Я пытаюсь заставить приложение symfony2 работать на эластичном бобовом стебле. Я пытаюсь получить переменные среды (RDS_USER, RDS_PASSWORD и т. Д.) В моих параметрах.yml, чтобы получить учетные данные базы данных.
Вещь symfony2 требует, чтобы переменные среды были префиксом SYMFONY__, поэтому я мог бы получить эти переменные без префиксов?Получить переменные среды в symfony2 parameters.yml

+0

так рад, что кто-то уже задал этот вопрос :) вот почему я люблю СО. Спасибо, парни. –

ответ

27

Вы можете загрузить файл 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')); 

UPDATE: Поскольку оригинальный ответ, было предоставлено новое решение (благодаря @darragh-enright для указания его) с использованием функции env-mapincenteev-parameters компонента в composer.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 см. documentation.

+0

Можно ли использовать getenv() в самом файле yml? вместо того, чтобы загружать его из ресурса? – kapitanluffy

+0

Нет, вы не можете. Чтобы использовать функции PHP, вам необходимо включить ресурс PHP. –

9

Просто чтобы дать конкретный пример, который работает для меня, я использую как parameters.yml и parameters.php в моем файле конфигурации (config.yml):

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

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

Надеется, что это помогает.

12

Мои извинения, потому что этот вопрос был дан ответ уже (и я нашел ответы очень полезно, спасибо @ tomas.pecserke и @dubrox!), Но я порылся немного больше, и я обнаружил альтернативу решение, которое, я думаю, стоит добавить для потомков.

Вкратце, вы можете добавить env-map в incenteev-parameters в composer.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" 
     } 
    } 
} 

Как указано в Using environment variables to set the parameters:

Для среды прод, используя интерактивную подсказку, может оказаться невозможным при развертывании. В этом случае вы можете полагаться на переменные среды для предоставления параметров. Это достигается за счет обеспечения отображения между переменными среды и параметрами они должны заполнить [...]

и

Если переменная установлена, ее значение всегда будет заменять значение, установленное в существующий файл параметров.

Я только что испытал это при новом развертывании 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_* параметры, и они будут автоматически экологическими ценностями. Развертывание. Awesome :)

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