对于使用docker-compose的Laravel应用,我具有以下(简化的)文件夹结构:
Project
|
|-- data
|-- ...
|-- docker
|-- ...
|-- laravel
|-- app
|-- ...
|-- .env
|-- docker-compose.yml
|-- .env
设置Docker-compose是为了在构造容器时从项目根文件夹中的
.env
文件加载数据库连接详细信息。 Laravel也需要这些,我必须在laravel文件夹内的.env
文件中复制它们。我想避免这种重复。理想情况下,我会在Laravel中加载这两个.env文件,以避免使用仅与Laravel相关的东西使docker-compose .env混乱。但是,只要有一种干净的方法,只要在项目根目录中只有一个.env文件,我几乎会很高兴。
我没有找到配置设置,但是在
loadEnvironmentFrom()
中找到了相关的方法useEnvironmentPath()
和Illuminate\Foundation\Application
,但是我不确定从哪里调用它们。我将扩展Application,但似乎在/boostrap/app.php
中实例化Dotenv时已经加载了它希望在供应商dolder之外的某个地方,我可以更改路径或及时加载其他.env文件,以便配置文件使用它。非常感谢帮助
最佳答案
在useEnvironmentPath()
中使用bootstrap/app.php
:
$app->useEnvironmentPath($env_path);
或作为解决方案:
$app->useEnvironmentPath(
dirname(__DIR__, 2)
);
__DIR__
返回当前文件的完整路径(因为您在bootstrap/app.php
中)dirname(__DIR__, 2)
,从文件位置返回2个步骤(在您的情况下,它返回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));
}
关于php - 如何在Laravel 6中从父目录加载多个.env文件或加载.env,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60566912/