Как правильно установить переменные ENV в Laravel 5?
В laravel 4 у нас было:
$env = $app->detectEnvironment(array(
'local' => array('homestead')
));
По умолчанию.
Но в laravel 5 он изменен на:
$env = $app->detectEnvironment(function()
{
return getenv('APP_ENV') ?: 'production';
});
Кроме того, они исключили .ОКР.* строка В.пример, вот он:
.env
И добавил файл .ОКР.пример:
APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=homestead
DB_PASSWORD=homestead
Итак, если у меня есть более 2 сред, я должен установить все из них в одном .энв файл сейчас? Например:
APP_ENV=local
DB_PASSWORD=123
APP_ENV=alpha
DB_PASSWORD=456
Если бы у меня не было .env file, как laravel узнает, какую среду я использую?
5 ответов:
Вы можете сделать это точно так же, как в 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 based environment detection в основном файле env (по умолчанию
.envфайл, вам нужно добавить:APP_ENV=localКонечно
На данный момент самая важная проблема, которую я вижу, заключается в том, что вам нужно помнить, когда вы идете на производство, чтобы изменить содержимое этого файлаlocalвот локальная среда, Вы можете изменить ее наproductionилиdev.envсAPP_ENV=localнаAPP_ENV=production, поэтому, на мой взгляд, гораздо лучший метод-это старый метод по умолчанию, основанный на именах ПК.Теперь ENV файлы. Если вы используете env based environment detection, вы должны поместить в свой ENV-файл только:
APP_ENV=localТеперь вы можете создавать отдельные файлы ENV для ваши различные среды, например:
.местный.env :
MY_DB=testdb.производство.env :
MY_DB=productiondbИ теперь в
bootstrap.environment.phpфайл вы можете в соответствии: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./ / править Су.. после копания в этом в течение последнего часа я мог бы также добавить некоторую дополнительную информацию здесь:
- Ларавель использует .env файлы для конфигурации
- по умолчанию файл ".env " в корневой каталог приложения загружается
- Вы можете получить доступ к значениям внутри них .env файлы через вспомогательная функция
env()или непосредственно через собственную функцию PHPgetenv(). Хотя вы должны сделать это только для заполнения ваших конфигурационных файлов (см./config/*.php), потому что они могут быть кэшированы.- the .env-файлы загружаются в классDetectEnvironment . Я нашел это полезным во время отладки, чтобы установить точки останова. Пожалуйста, обратите внимание на строку
(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();: так как она используетload()любое значение среды, которое уже было задано, не будет перезаписано! (вам придется использоватьoverload()сделать это-это свело меня с ума , потому что homestead устанавливает переменнуюAPP_ENVвlocalв конфигурации php-fpm/etc/php/7.0/fpm/php-fpm.conf, и вы не можете изменить ее через .env файл)- при написании модульных тестов вы обычно наследуете от
TestCase, который устанавливает переменнуюAPP_ENVв testing (viarefreshApplication()-- использованиеputenv()для переопределения значения по умолчаниюlocal)
Вы можете проверить, как правильно настроить. Как настроить множественную среду для Laravel 5 Developers Way
Основываясь на Marcin Nabiałek , я удалил часть его и поместил в соответствующий файл, чтобы загрузить его правильно.
Я просто хотел внести свой вклад в решение для 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задает среду и все переменные среды.Итак, если у меня есть более 2 сред, нужно ли мне устанавливать все из них в единственном экземпляре .энв файл сейчас?
Нет. У вас будет
.envфайл в каждом месте, где установлено приложение. Разница заключается в том, что находится внутри этого файла.Кроме того, поскольку файл
.envявляется просто хранилищем значений ключей, любые последующие объявления будут перезаписывать предыдущие. В вашем примере Laravel никогда не увидит ваши "локальные" настройки.Поначалу это кажется странным, но эта новая система по умолчанию на самом деле проще и менее подвержена проблемам, которые были/есть у" 4.2 way", поскольку здесь нет места для логики ошибки.
Если бы у меня не было .env file, как laravel узнает, какую среду я использую?
Он вообще не будет работать. В файле
.envтакже есть объявлениеAPP_KEY, без которого Laravel не будет работать. Без файла.envвы получите ошибку сервера 500.
Comments