Laravel - Load different .env file

12.9k Views Asked by At

I need to load a different .env file, named .env.test under certain conditions.

I attempted to do that through a middleware by adding

app()->loadEnvironmentFrom('.env.test');
Dotenv::create(base_path(), '.env.test')->overload();

to the bootstrap() method of Kernel.php. I also tried to create a dedicated middleware for this and load it as the first one in the web middleware group. But either way, it is loading the standard .env file.

It works if I do it in the /bootstrap/app.php file but I really don't want to put it there.

4

There are 4 best solutions below

0
On BEST ANSWER

I just figured it out: The default .env file is being loaded inside of the bootstrap() method of LoadEnvironmentVariables.php.

To use the .env.test file I had to restructure my initial bootstrap() method inside of the App/Http/Kernel.php file to look like this:

public function bootstrap() 
{
    app()->loadEnvironmentFrom('.env.test');
    parent::bootstrap(); 
}

So the essential part was to move the parent::bootstrap() call below the loadEnvironmentFrom() call.

11
On

Instead of doing any code change, you can use export command create a file called .env.test, you want to sue this as .env file use terminal

  1. APP_ENV=local

  2. php artisan config:cache

  3. php artisan key:generate

This below edit is to explain how .env file is getting set In Illuminate\Foundation\Application class has method loadEnvironmentFrom which is taking the file as parameter and setting it,

you can use bootstrap/app.php after you are getting $app

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
 );

here you will be having instance of Illuminate\Foundation\Application

you can just call the loadEnvironmentFrom function like

$app->loadEnvironmentFrom('.env.local');

May be it is better to use Kernel.php instead of this, I do not think either of bootstrap/app.php or kernel.php will get overridden with composer update, so make more calculation while using it. I have added this, so that it will help you understand the stuffs.

0
On

I also tried $app->loadEnvironmentFrom('.env.dev'); for dev, staging, and production but I don't want to change code in bootstrap/app.php Then I have an idea, you can try this.

I create 3 environment files (.env.dev, .env.staging, .env.production). When I want to change the environment I run the copy command of Linux like this: cp .env.dev .env or cp .env.staging .env ...

Remember to add your new env files to the .gitignore file

Hope this helps

1
On

You can load a different environment file using APP_ENV

For example if APP_ENV=test then .env.test can be loaded.

More info: https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L41