Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get environment variables in symfony2 parameters.yml

I'm trying to get my symfony2 app running on elastic beanstalk. I'm trying to get environment variables (RDS_USER, RDS_PASSWORD, etc...) in my parameters.yml in order to get the database credentials.
The thing is symfony2 needs the environment variables to be prefixed by SYMFONY__ so I could I get these variables without prefixes ?

like image 539
arthurquerou Avatar asked Mar 14 '13 14:03

arthurquerou


2 Answers

My apologies, because this question has been answered already (and I found the answers very helpful, thanks @tomas.pecserke and @dubrox!), but I dug around a little more and I discovered an alternative solution that I think is worth adding for posterity.

In a nutshell, you can add an env-map to incenteev-parameters in composer.json to map available environmental variables to parameters; 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"
        }
    }
}

As documented in Using environment variables to set the parameters:

For your prod environment, using an interactive prompt may not be possible when deploying. In this case, you can rely on environment variables to provide the parameters. This is achieved by providing a map between environment variables and the parameters they should fill [...]

and

If an environment variable is set, its value will always replace the value set in the existing parameters file.

I just tested this on a fresh EB deployment and it worked a treat. You can test this with a local deployment, like 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

The interactive prompt will skip all database_* parameters, and they will be automatically populated by the environmental values. Deployment sanity. Awesome :)

like image 39
Darragh Enright Avatar answered Sep 24 '22 13:09

Darragh Enright


You can load a php file as a resource:

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

And from there it's easy:

// 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: Since the original answer, a new solution was provided (thanks to @darragh-enright for pointing it out) using env-map feature of incenteev-parameters component 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"
        }
    }
}

Any mapped parameter would be overwritten by value from environment variable. For more info on env-map see documentation.

like image 193
tomas.pecserke Avatar answered Sep 25 '22 13:09

tomas.pecserke