Получить переменные среды в параметрах symfony2.

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

Ответы

Ответ 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'));

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 см. документация.

Ответ 2

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

В двух словах вы можете добавить env-map to 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"
        }
    }
}

Как описано в Использование переменных среды для установки параметров:

Для вашей среды 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_*, и они будут автоматически заполнены значениями окружающей среды. Развертывание. Awesome:)

Ответ 3

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

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

Сохранение в 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'));
}

Надеюсь, что это поможет.

Ответ 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'], '');