Ich versuche, meine symfony2 App auf elastischen Bohnenstange laufen zu lassen. Ich versuche, Umgebungsvariablen (RDS_USER, RDS_PASSWORD, etc ...) in meine paramters.yml zu bekommen, um die Datenbankanmeldeinformationen zu bekommen.
Die Sache ist Symfony2 benötigt die Umgebungsvariablen, die SYMFONY__
vorangestellt werden, damit ich diese Variablen ohne Präfixe bekommen könnte?Holen Sie Umgebungsvariablen in symfony2 parameter.yml
Antwort
Sie können eine PHP-Datei als Ressource laden:
# app/config/config.yml
imports:
- { resource: parameters.php }
Und von dort ist es einfach:
// 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: Da die ursprüngliche Antwort, eine neue Lösung wurde zur Verfügung gestellt (Danke an @darragh-enright für den Hinweis) mit env-map
Feature von incenteev-parameters
Komponente in 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"
}
}
}
Alle zugeordneten Parameter werden durch den Wert aus der Umgebungsvariablen überschrieben. Für weitere Informationen über env-map
siehe documentation.
kann ich getenv() in der Yml-Datei selbst verwenden? anstatt es von einer Ressource zu laden? – kapitanluffy
Nein, das geht nicht. Um PHP-Funktionen nutzen zu können, müssen Sie PHP-Ressourcen einbinden. –
Nur ein explizites Beispiel zu geben, die für mich arbeiten, ich verwende sowohl die parameters.yml
und parameters.php
in meiner Konfigurationsdatei (config.yml
):
# app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: parameters.php }
Keeping in parameters.yml
meine Vorgaben und einige von ihnen zu überschreiben in parameters.php
, wenn mindestens ein RDS-Umgebungsvariable gefunden wird:
<?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'));
}
Hoffe, es hilft.
Ich entschuldige mich, weil diese Frage bereits beantwortet wurde (und ich fand die Antworten sehr hilfreich, dank @ tomas.pecserke und @dubrox!), Aber ich um ein wenig mehr gegraben und entdeckte ich eine Alternative Lösung, die ich denke, ist es wert für die Nachwelt hinzuzufügen.
Kurz gesagt, können Sie env-map
zu incenteev-parameters
in composer.json
hinzufügen, um verfügbare Umgebungsvariablen zu Parametern zuzuordnen; z:
"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"
}
}
}
Wie in Using environment variables to set the parameters dokumentiert:
Für Ihre prod Umgebung, eine interaktive Aufforderung nicht möglich sein kann, bei der Bereitstellung. In diesem Fall können Sie sich auf Umgebungsvariablen verlassen, um die Parameter bereitzustellen. Dies wird erreicht, indem eine Karte zwischen Umgebungsvariablen bereitstellt und die Parameter, die sie füllen sollte [...]
und
Wenn eine Umgebungsvariable gesetzt ist, wird dessen Wert immer den Wert ersetzen gesetzt in die vorhandene Parameterdatei.
Ich habe es gerade auf einer neuen EB-Bereitstellung getestet und es hat ein Vergnügen gemacht. Sie können dies testen mit einem lokalen Einsatz, etwa so:
rm app/config/parameters.yml
export RDS_HOSTNAME=foo \
RDS_PORT=3306 \
RDS_DB_NAME=bar \
RDS_USERNAME=baz \
RDS_PASSWORD=quux
composer install
Die interaktive Eingabeaufforderung werden alle database_*
Parameter überspringen, und sie werden durch die Umweltwerte automatisch ausgefüllt werden. Deployment Vernunft. Genial :)
<?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'], '');
so froh, dass jemand diese Frage schon gestellt hat :) deshalb liebe ich SO. danke Leute. –