Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the correct way to set ENV variables in Laravel 5?

In laravel 4 we had:

$env = $app->detectEnvironment(array(     'local' => array('homestead') )); 

by default.

But in laravel 5 it's changed to:

$env = $app->detectEnvironment(function() {     return getenv('APP_ENV') ?: 'production'; }); 

Also, they have excluded .env.* line in .gitignore, now it has:

.env 

And added file .env.example:

APP_ENV=local APP_KEY=SomeRandomString DB_USERNAME=homestead DB_PASSWORD=homestead 

So, if i have more than 2 environments, do i have to set all of them in a single .env file now? E.g.:

APP_ENV=local DB_PASSWORD=123  APP_ENV=alpha DB_PASSWORD=456 

If i would have no .env file, how laravel will know what environment i am using?

like image 388
Alexander Kim Avatar asked Oct 13 '14 18:10

Alexander Kim


People also ask

What is env example in Laravel?

env. example file, on the contrary, is included in the repository – it is used as an example file for you to know what KEY=VALUE pairs you need for your project. Most often it is used to copy it to . env file and then change the values. You can also read about it in the official Laravel documentation.

For what do the .env is used in Laravel?

Laravel's default . env file contains some common configuration values that may differ based on whether your application is running locally or on a production web server. These values are then retrieved from various Laravel configuration files within the config directory using Laravel's env function.


1 Answers

You can do it exactly the same as in Laravel 4:

$env = $app->detectEnvironment(array(     'local' => array('homestead') )); 

*.env file are just used to put sensitive data that shouldn't be put into VCS. The same is in Laravel 4

but is seems that in last days default detectEnvironment was changed to:

$env = $app->detectEnvironment(function() {     return getenv('APP_ENV') ?: 'production'; }); 

so you can use either setting variable from PC name or from ENV file.

If you use ENV based environment detection in main env file (by default .env file you need to add:

APP_ENV=local 

Of course local here is local environment, you can change it into production or dev

At the moment the most important issue I see is that you need to remember when going on production to change this .env file content from APP_ENV=local to APP_ENV=production so in my opinion much better method is the old default method based on PC names.

Now ENV files. If you use ENV based environment detection, you should put into your ENV file only:

APP_ENV=local 

Now you can create separate ENV files for your different environments for example:

.local.env :

 MY_DB=testdb 

.production.env :

MY_DB=productiondb 

and now in bootstrap.environment.php file you can modfiy:

if (file_exists(__DIR__.'/../.env')) {     Dotenv::load(__DIR__.'/../'); } 

into:

if (file_exists(__DIR__.'/../.env')) {     Dotenv::load(__DIR__.'/../');      if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {         Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');     }    } 

to load extra env file based on APP_ENV from main env file.

Now you will be able to use it in your other configuration file as always: $_ENV['MY_DB']

like image 140
Marcin Nabiałek Avatar answered Sep 20 '22 17:09

Marcin Nabiałek