Как иметь специфичные для среды файлы .env для dotenv (в Laravel 5)

Я только начал использовать Laravel 5, в котором используется библиотека dotenv. При этом используется файл .env в корне проекта, который устанавливает среду с помощью этой строки:

APP_ENV=local

Согласно всему, что я читал по этому вопросу, вся другая конфигурация среды должна быть помещена в этот файл, поэтому пароли базы данных, URL-адреса и т. Д., Которые затем считываются в основной массив конфигурации следующим образом:

env('DB_HOST', 'localhost')

Хотя я чувствую, что это может работать для некоторых конкретных вещей, таких как пароли базы данных, которые вы, возможно, не хотите фиксировать, я действительно хочу иметь возможность фиксировать большинство или все мои различные значения среды для каждой среды.

Таким образом, я хочу, чтобы .env определял APP_ENV как «локальный», «промежуточный» или «производственный», а затем имел файл .local.env или .env.local, содержащий значения, которые я затем могу зафиксировать, и правильный файл будет загружаться на основе APP_ENV.

Это возможно? В Laravel 4 были каскадные массивы конфигурации, которые казались намного более гибкими, но если у меня есть файл окружения .env, я могу с этим смириться.


person Gnuffo1    schedule 20.01.2015    source источник


Ответы (3)


В конце концов решил это, изменив app/Providers/ConfigServiceProvider.php. Этот файл добавляется как заглушка в папку вашего приложения при создании проекта и предназначен для переопределения значений конфигурации.

Теперь он обрабатывает каскадные конфигурации, так что любые значения в config/local/app.php, например, переопределяют config/app.php. Как сказано в комментарии ниже, он не обрабатывает совпадающие массивы в конфигурации среды и просто заменит их. Но я могу решить это, когда мне это нужно.

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Symfony\Component\Finder\Finder;

class ConfigServiceProvider extends ServiceProvider {

    /**
     * Overwrite any vendor / package configuration.
     *
     * This service provider is intended to provide a convenient location for you
     * to overwrite any "vendor" or package configuration that you may want to
     * modify before the application handles the incoming request / command.
     *
     * Modified 2014-01-20 to allow environment specific configs to be loaded
     * from app/config/[environment]/ which will cascade over the base configs.
     *
     * @return void
     */
    public function register()
    {
        $config = app('config');
        $envPath = app()->configPath() . '/' . getenv('APP_ENV');

        foreach (Finder::create()->files()->name('*.php')->in($envPath) as $file)
        {
            $configName = basename($file->getRealPath(), '.php');
            $oldConfigValues = $config->get($configName);
            $newConfigValues = require $file->getRealPath();

            // Replace any matching values in the old config with the new ones.
            // Doesn't yet handle matching arrays in the config, it will just replace them.
            $config->set($configName, $newConfigValues + $oldConfigValues);
        }
    }

}
person Gnuffo1    schedule 20.01.2015

Вы не должны обязательно использовать .env для всего. Есть несколько вариантов.

Вариант 1. Используйте только .env для переменной

'default' => env('DB_CONNECTION'),

Вариант 2. Используйте только .env для переменной, но используйте системное значение по умолчанию, если его не существует

'default' => env('DB_CONNECTION', 'mysql'),

Вариант 3 - просто жестко закодируйте свою переменную и не делайте ее устанавливаемой через .env

'default' => 'mysql',

Вариант 2, вероятно, лучше всего подходит для большинства параметров конфигурации. Вы по-прежнему определяете (и фиксируете) параметр для своей конфигурации в своем репозитории git, но вы можете легко переопределить его в любом файле .env в будущем, если захотите.

Вариант 1 лучше всего подходит для паролей, ключей приложений и т. д., поэтому они никогда не будут привязаны к вашему репозиторию git.

Вариант 3 предназначен для нескольких переменных конфигурации, которые, как вы знаете, никогда не изменятся.

Примечание. Опция каскадной папки конфигурации Laravel 4 больше недоступна.

person Laurence    schedule 20.01.2015
comment
Спасибо. Мне не нравится этот новый метод, я думаю, что я определю функцию, которая будет загружать локальные, промежуточные и т. д. папки и каскадировать массив так же, как и раньше. В конце концов, это PHP-файлы, поэтому массивы можно определять программно. - person Gnuffo1; 20.01.2015
comment
Я работаю локально над Laravel. Только начал. Где я могу получить файл .ENV в моей папке «laravel»? - person Nana Partykar; 04.09.2015

Среду Laravel 5 легко настроить.

  1. Откройте корневую папку приложения и найдите «.env.example»,
  2. Скопируйте и переименуйте в ".env",
  3. Пожалуйста, вставьте файл ".env" в вашу среду,
  4. Если вы используете GIT, убедитесь, что вы не отправляете этот файл в свой репозиторий GIT.

Для «полного объяснения» я пишу эту конфигурацию здесь.

Я цитирую разработчика dotenv;

phpdotenv предназначен для сред разработки и, как правило, не должен использоваться в производственной среде. В рабочей среде фактические переменные среды должны быть установлены таким образом, чтобы не было дополнительных затрат на загрузку файла .env при каждом запросе. Этого можно добиться с помощью автоматизированного процесса развертывания с помощью таких инструментов, как Vagrant, chef или Puppet, или вручную с помощью облачных хостов, таких как Pagodabox и Heroku.

person user3851143    schedule 13.02.2015
comment
ОП спрашивает, как иметь отдельный файл .env для каждой среды, такой как разработка, тестирование и производство. - person user2094178; 13.02.2015
comment
Я обновил свой ответ (добавлена ​​цитата разработчика). Итак, на машину приходится только один .env. И в производстве вы не должны использовать файл .env. - person user3851143; 13.02.2015
comment
Действительно, вы НИКОГДА не должны иметь .production.env, но вы можете иметь .specialenv.env, который можно скопировать в .env, чтобы использовать эти настройки. - person Sander Visser; 05.01.2016