Я пытаюсь заставить приложение symfony2 работать на эластичном бобовом стебле. Я пытаюсь получить переменные среды (RDS_USER, RDS_PASSWORD и т. Д.) В моих параметрах.yml, чтобы получить учетные данные базы данных.
Вещь symfony2 требует, чтобы переменные среды были префиксом SYMFONY__
, поэтому я мог бы получить эти переменные без префиксов?Получить переменные среды в symfony2 parameters.yml
ответ
Вы можете загрузить файл 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-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"
}
}
}
Любой отображаемый параметр будет перезаписан значением из переменной окружения. Для получения дополнительной информации о env-map
см. documentation.
Можно ли использовать getenv() в самом файле yml? вместо того, чтобы загружать его из ресурса? – kapitanluffy
Нет, вы не можете. Чтобы использовать функции PHP, вам необходимо включить ресурс PHP. –
Просто чтобы дать конкретный пример, который работает для меня, я использую как 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'));
}
Надеется, что это помогает.
Мои извинения, потому что этот вопрос был дан ответ уже (и я нашел ответы очень полезно, спасибо @ 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 :)
<?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'], '');
так рад, что кто-то уже задал этот вопрос :) вот почему я люблю СО. Спасибо, парни. –