Каков правильный способ установки переменных ENV в Laravel 5?

В laravel 4 у нас было:

$env = $app->detectEnvironment(array( 'local' => array('homestead') )); 

по умолчанию.

Но в laravel 5 он изменился на:

 $env = $app->detectEnvironment(function() { return getenv('APP_ENV') ?: 'production'; }); 

Кроме того, они исключили строку .env. * В .gitignore, теперь она имеет:

 .env 

Добавлен файл .env.example:

 APP_ENV=local APP_KEY=SomeRandomString DB_USERNAME=homestead DB_PASSWORD=homestead 

Итак, если у меня более двух окружений, я должен установить все из них в одном .ENV-файле сейчас? Например:

 APP_ENV=local DB_PASSWORD=123 APP_ENV=alpha DB_PASSWORD=456 

Если бы у меня не было файла .env, как laravel будет знать, какую среду я использую?

Вы можете сделать это точно так же, как в Laravel 4:

 $env = $app->detectEnvironment(array( 'local' => array('homestead') )); 

*.env файл просто используется для размещения конфиденциальных данных, которые нельзя вставлять в VCS. То же самое происходит в Laravel 4

но кажется, что в последние дни default detectEnvironment был изменен на:

 $env = $app->detectEnvironment(function() { return getenv('APP_ENV') ?: 'production'; }); 

поэтому вы можете использовать либо переменную настройки из имени ПК, либо из файла ENV.

Если вы используете обнаружение среды на основе ENV в главном файле env (по умолчанию файл .env вам нужно добавить:

 APP_ENV=local 

Конечно, local здесь локальная среда, вы можете изменить ее на production или dev

На данный момент самая важная проблема, которую я вижу, – это то, что вам нужно помнить, когда вы собираетесь производить этот файл APP_ENV=local с APP_ENV=local на APP_ENV=production поэтому, на мой взгляд, гораздо лучший метод – это старый метод по умолчанию, основанный на именах ПК ,

Теперь файлы ENV. Если вы используете обнаружение среды на основе ENV, вы должны поместить в свой файл ENV только:

 APP_ENV=local 

Теперь вы можете создавать отдельные файлы ENV для разных сред, например:

.local.env :

  MY_DB=testdb 

.production.env :

 MY_DB=productiondb 

и теперь в файле bootstrap.environment.php вы можете modfiy:

 if (file_exists(__DIR__.'/../.env')) { Dotenv::load(__DIR__.'/../'); } 

в:

 if (file_exists(__DIR__.'/../.env')) { Dotenv::load(__DIR__.'/../'); if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) { Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); } } 

для загрузки дополнительного файла env на основе APP_ENV из основного файла env.

Теперь вы сможете использовать его в другом конфигурационном файле, как всегда: $_ENV['MY_DB']

Для тех, кто только что обновился до 5,2:

Вы больше не можете использовать статический Dotenv::load() . Вместо этого используйте следующее:

 $dotenv = new Dotenv\Dotenv(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); // Laravel 5.2 $dotenv->load(); 

в bootstrap/app.php .

// отредактируйте Soo .. после того, как в течение последнего часа я заглянул в это, я мог бы добавить дополнительную информацию здесь:

  • Laravel использует .env файлы для конфигурации
  • По умолчанию загружается файл «.env» в корневой каталог приложения
  • Вы можете получить доступ к значениям в этих файлах .env с помощью вспомогательной функции env() или напрямую через собственную функцию getenv() PHP. Хотя вы должны сделать это только для заполнения ваших конфигурационных файлов (см. /config/*.php ), поскольку они могут быть кэшированы .
  • файлы .env загружаются в класс DetectEnvironment . Я нашел это полезным при отладке для установки точек останова. Обратите внимание на строку (new Dotenv($app->environmentPath(), $app->environmentFile()))->load(); : Поскольку он использует load() любое значение среды, которое уже было установлено, не будет перезаписано! (Вам пришлось бы использовать overload() чтобы сделать это – это заставило меня APP_ENV потому что homestead устанавливает переменную APP_ENV в local конфигурацию php- /etc/php/7.0/fpm/php-fpm.conf config /etc/php/7.0/fpm/php-fpm.conf и вы не можете ее изменить через .env файл)
  • при написании модульных тестов вы обычно наследуете TestCase , который устанавливает переменную APP_ENV для тестирования (через refreshApplication() – с помощью putenv() для переопределения local значения по умолчанию)

Вы можете проверить, как правильно настроить. Как настроить несколько окружений для Laravel 5 Developers Way

Основываясь на Марчине Набиалеке , я удалил часть его и поместил его в надлежащий файл, чтобы загрузить его правильно.

Я просто хотел внести свой вклад в решение для Laravel 5.1, которое немного проще IMHO. В bootstrap / app.php у меня есть (сразу после создания приложения):

 $app->beforeBootstrapping(\Illuminate\Foundation\Bootstrap\DetectEnvironment::class, function() use ($app) { $suffix = (env('APP_ENV')) ? '.'.env('APP_ENV') : ''; $app->loadEnvironmentFrom('.env'.$suffix); }); 

Нет необходимости в проверке или обработке ошибок. Laravel по умолчанию «production», если файл не найден.

Вот и все.

Тот факт, что по умолчанию у вас не может быть более одного файла .env и что он исключен в .gitignore, преднамерен и предназначен для управления средами. Файл .env не должен находиться в управлении версиями и должен быть настроен для каждой среды. .env устанавливает вашу среду и все переменные среды.

Итак, если у меня более двух окружений, я должен установить все из них в одном .ENV-файле сейчас?

Нет. У вас будет файл .env в каждом месте, где установлено ваше приложение. Разница заключается в том, что находится внутри этого файла.

Кроме того, поскольку .env файл – это просто хранилище ключей, любые последующие объявления будут перезаписывать предыдущие. В вашем примере Laravel никогда не увидит ваши «локальные» настройки.

Сначала кажется странным, но эта новая система по умолчанию на самом деле вообще проще и менее подвержена проблемам, которые имеет «4.2-й способ», поскольку нет логических ошибок.

Если бы у меня не было файла .env, как laravel будет знать, какую среду я использую?

Это не сработало. В файле .env также есть объявление APP_KEY , с которым Laravel не будет работать. Без файла .env вы получите ошибку сервера 500.