Laravel - 加载不同的 .env 文件

The*_*Guy 7 php laravel laravel-6

我需要在某些条件下加载另一个名为.env.test的 .env 文件。

我尝试通过添加中间件来做到这一点

app()->loadEnvironmentFrom('.env.test');
Dotenv::create(base_path(), '.env.test')->overload();
Run Code Online (Sandbox Code Playgroud)

Kernel.phpbootstrap()的方法。我还尝试为此创建一个专用中间件并将其加载为Web中间件组中的第一个中间件。但无论哪种方式,它都会加载标准 .env 文件。

如果我在/bootstrap/app.php文件中执行它,它就可以工作,但我真的不想把它放在那里。

The*_*Guy 8

我刚刚弄清楚:默认的 .env 文件正在LoadEnvironmentVariables.phpbootstrap()的方法内部加载。

要使用 .env.test 文件,我必须在App/Http/Kernel.phpbootstrap()文件中重构我的初始方法,如下所示:

public function bootstrap() 
{
    app()->loadEnvironmentFrom('.env.test');
    parent::bootstrap(); 
}
Run Code Online (Sandbox Code Playgroud)

因此,最重要的部分是将调用移至parent::bootstrap()调用下方loadEnvironmentFrom()


Pra*_*ahu 6

您可以使用导出命令创建一个名为 .env.test 的文件,而不是进行任何代码更改,您想将其作为 .env 文件使用终端

  1. APP_ENV=local

  2. php artisan config:cache

  3. php artisan key:generate

下面的编辑是解释如何设置 .env 文件在Illuminate\Foundation\Application类中有一个方法loadEnvironmentFrom,该方法将文件作为参数并设置它,

bootstrap/app.php获得后即可使用$app

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
 );
Run Code Online (Sandbox Code Playgroud)

在这里你将拥有 Illuminate\Foundation\Application 的实例

你可以像这样调用 loadEnvironmentFrom 函数

$app->loadEnvironmentFrom('.env.local');
Run Code Online (Sandbox Code Playgroud)

可能最好使用 Kernel.php 而不是这个,我不认为 bootstrap/app.php 或 kernel.php 会被 覆盖composer update,所以在使用它时进行更多计算。我添加了这个,以便它可以帮助您理解这些内容。