Obtenez des variables d'environnement dans les paramètres symfony2.yml

j'essaie de faire fonctionner mon application symfony2 avec du haricot élastique. J'essaie d'obtenir des variables d'environnement (RDS_USER, RDS_PASSWORD, etc...) dans mes paramètres.yml afin d'obtenir les identifiants de base de données.

Le truc c'est que symfony2 a besoin que les variables d'environnement soient préfixées par SYMFONY__ donc je peux obtenir ces variables sans préfixes ?

17
demandé sur arthurquerou 2013-03-14 18:18:36

4 réponses

Vous pouvez charger un fichier php comme une ressource:

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

et de là, c'est facile:

// 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: Depuis la réponse initiale, une nouvelle solution a été apportée (grâce à @darragh-enright pour le pointage) à l'aide de env-map caractéristique incenteev-parameters composant 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"
        }
    }
}

tout paramètre cartographié serait écrasé par la valeur de la variable d'environnement. Pour plus d'informations sur env-map voir documentation.

27
répondu tomas.pecserke 2017-05-23 12:09:52

mes excuses, parce que cette question a déjà été répondue (et j'ai trouvé les réponses très utiles, merci @tomas.pecserke!--8--> et @dubrox!), mais j'ai creusé un peu plus et j'ai découvert une solution alternative qui je pense vaut la peine d'ajouter pour la postérité.

en bref, vous pouvez ajouter un env-mapincenteev-parameterscomposer.json cartographier les variables environnementales disponibles en fonction des paramètres; E. g:

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

Comme indiqué dans en utilisant variables d'environnement pour définir les paramètres:

pour votre environnement prod, l'utilisation d'une invite interactive peut ne pas être possible lors du déploiement. Dans ce cas, vous pouvez compter sur des variables d'environnement pour fournir les paramètres. Ceci est réalisé en fournissant une carte entre les variables d'environnement et les paramètres qu'ils doivent remplir [...]

et

si une variable d'environnement est définie, sa valeur remplacera toujours valeur définie dans le fichier de paramètres existant.

je viens de tester ceci sur un nouveau déploiement EB et ça a marché. Vous pouvez le tester avec un déploiement local, comme suit:

rm app/config/parameters.yml

export RDS_HOSTNAME=foo \ 
       RDS_PORT=3306 \
       RDS_DB_NAME=bar \
       RDS_USERNAME=baz \
       RDS_PASSWORD=quux

composer install

l'invite interactive sautera tout database_* paramètres, et ils seront automatiquement renseignées par les valeurs environnementales. Le déploiement de la raison. Génial :)

12
répondu Darragh Enright 2015-09-08 08:24:36

juste pour donner un exemple explicite qui fonctionne pour moi, j'utilise les deux parameters.yml et parameters.php dans mon fichier de configuration (config.yml):

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

parameters.yml mes paramètres par défaut et de l'écraser certains d'entre eux dans parameters.php si au moins une variable d'environnement RDS est trouvée:

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

j'Espère que ça aide.

9
répondu dubrox 2017-06-07 20:01:10
<?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'], '');
1
répondu salehsed 2015-10-16 05:00:04