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 ?
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.
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-map
incenteev-parameters
composer.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 :)
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.
<?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'], '');