如何加载多个 .env 文件或从 Laravel 6 中的父目录加载 .env

How to load multiple .env files or load .env from parent directory in Laravel 6

对于使用 docker-compose 的 Laravel 应用程序,我有以下(简化的)文件夹结构:

Project
|
|-- data
    |-- ...
|-- docker
    |-- ...
|-- laravel
    |-- app
    |-- ...
    |-- .env
|-- docker-compose.yml
|-- .env

Docker-compose 设置为在构建容器时从项目根文件夹中的 .env 文件加载数据库连接详细信息。 Laravel 也需要这些,我必须将它们复制到 laravel 文件夹内的 .env 文件中。

我想避免这种重复。理想情况下,我会在 Laravel 中加载两个 .env 文件,以避免将 docker-compose .env 与仅与 Laravel 相关的内容混在一起。但我几乎同样乐意在项目根目录中拥有一个 .env 文件,前提是有一种干净的方法来做到这一点。

我没有找到配置设置,但在 Illuminate\Foundation\Application 中找到了相关方法 loadEnvironmentFrom()useEnvironmentPath(),但我不确定从哪里调用它们。我会扩展应用程序,但似乎 Dotenv 在 /boostrap/app.php

中实例化时已经加载

希望在供应商 dolder 之外的某个地方我可以更改路径或及时加载不同的 .env 文件以供配置文件使用。非常感谢帮助

bootstrap/app.php中使用useEnvironmentPath():

$app->useEnvironmentPath($env_path);

或作为解决方案:

$app->useEnvironmentPath(
  dirname(__DIR__, 2)
);

__DIR__ returns 当前文件的完整路径(因为你在 bootstrap/app.php
dirname(__DIR__, 2),从您的文件位置返回 2 个步骤(在您的情况下,它 returns 您的 Project 目录路径)

现在 Laravel 应该读取您的新 .env 文件。

-- 更新--

对于 HTTP 应用程序,更新 app/Http/Kernel.php :

use Illuminate\Routing\Router;
use Illuminate\Contracts\Foundation\Application;
//////
    /**
     * Create a new HTTP kernel instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    public function __construct(Application $app, Router $router)
    {
        $app->useEnvironmentPath(dirname(__DIR__, 3));
        parent::__construct($app, $router);
    }

对于控制台应用程序,编辑 app/Console/Kernel.php:

use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Contracts\Foundation\Application;

/////
    /**
     * Create a new console kernel instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function __construct(Application $app, Dispatcher $events)
    {
        $app->useEnvironmentPath(dirname(__DIR__, 3));
        parent::__construct($app, $events);
    }

app/Providers/AppServiceProvider.php

public function boot() {
    app()->useEnvironmentPath(dirname(__DIR__, 3));
}