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

标签 php docker configuration laravel-6 dotenv

对于使用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/

相关文章:

php - 如何在joomla cms中显示文章? (在自己的html模板中)

docker - 可以将Docker机器与持续集成工具一起使用吗?

docker - 带有WebStorm节点远程解释器的Mac版Docker

sockets - 如何与 Docker 容器建立 TCP 传出连接?

java - 部署 WAR 后在 log4j2.xml 中定义文件位置

php - PHP 数组合并和删除重复问题

php - 在 PHP 中使用序列化将数据存储到数据库中是一个好习惯吗?

php - 从 mysql 数据库中选择多列的最快方法是什么?

postgresql - PostgreSQL 错误信息的配置

java - 设置新配置后如何更新所有 Spring 对象?