Как загрузить несколько файлов .env или загрузить .env из родительского каталога в Laravel 6 - PullRequest
0 голосов
/ 06 марта 2020

Для приложения Laravel, использующего docker -compose, у меня есть следующая (упрощенная) структура папок:

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

Docker -compose настроен для загрузки сведений о подключении к базе данных из * Файл 1004 * в папке root проекта при создании контейнеров. Laravel они также нужны, и мне нужно продублировать их в файле .env внутри папки laravel.

Я бы хотел избежать этого дублирования. В идеале я бы загружал оба файла .env в Laravel, чтобы не загромождать docker -композицию .env материалами, относящимися только к Laravel. Но я был бы почти так же рад, если бы в проекте root был только один файл .env, при условии, что есть чистый способ сделать это.

Я не нашел никаких настроек конфигурации, но есть соответствующие методы loadEnvironmentFrom() и useEnvironmentPath() внутри Illuminate\Foundation\Application, но я не уверен, откуда их вызывать. Я бы расширил Application, но кажется, что Dotenv уже загружен к моменту его создания в /boostrap/app.php

Надеемся, что есть где-то за пределами продавца dolder, где я мог бы изменить путь или загрузить другой .env файл вовремя, чтобы его использовали файлы конфигурации. Помощь очень ценится

1 Ответ

1 голос
/ 06 марта 2020

Используйте useEnvironmentPath() in 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));
}
...