如何加载多个 .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));
}
对于使用 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));
}