Как правильно установить переменные ENV в Laravel 5?
На четвертом уровне мы имели:
$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 узнает, какую среду я использую?
6 ответов
Вы можете сделать это точно так же, как в Laravel 4:
$env = $app->detectEnvironment(array(
'local' => array('homestead')
));
*.env
файл просто используется, чтобы поместить конфиденциальные данные, которые не должны быть помещены в VCS. То же самое в Ларавеле 4
но похоже, что в последние дни по умолчанию DetectiveEnvironment был изменен на:
$env = $app->detectEnvironment(function()
{
return getenv('APP_ENV') ?: 'production';
});
так что вы можете использовать либо установочную переменную из имени ПК, либо из файла ENV.
Если вы используете обнаружение среды на основе ENV в основном файле env (по умолчанию .env
файл, который нужно добавить:
APP_ENV=local
Конечно local
здесь местная среда, вы можете изменить ее на production
или же dev
На данный момент самая важная проблема, которую я вижу, заключается в том, что вам нужно помнить, когда вы собираетесь работать, чтобы изменить .env
содержимое файла из 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
файл, который вы можете изменить:
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()
вспомогательная функция или напрямую через PHPgetenv()
функция. Хотя вы должны сделать это только для заполнения ваших конфигурационных файлов (см./config/*.php
), потому что те могут быть кэшированы. - файлы.env загружаются в класс DetectEnvironment. Я нашел это полезным при отладке для установки точек останова. Пожалуйста, обратите внимание на строку
(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
: Так как он используетload()
любое значение среды, которое уже было установлено, не будет перезаписано! (Вы должны использоватьoverload()
сделать это - это сводило меня с ума, потому что усадьба устанавливаетAPP_ENV
переменная кlocal
в конфиге php-fpm/etc/php/7.0/fpm/php-fpm.conf
и вы не можете изменить его через файл.env) - при написании юнит-тестов вы обычно наследуете от
TestCase
, который устанавливаетAPP_ENV
переменная для тестирования (черезrefreshApplication()
-- с помощьюputenv()
переопределить значение по умолчаниюlocal
значение)
Вы можете проверить, как правильно настроить. Как настроить несколько сред для разработчиков Laravel 5 Way
Основываясь на Marcin Nabiałek, я удалил некоторую его часть и поместил в соответствующий файл, чтобы загрузить ее правильно.
Я просто хотел поделиться своим решением для Laravel 5.1, которое немного проще ИМХО. В 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
file - это просто хранилище значений ключей, любые последующие объявления перезаписывают предыдущие. В вашем примере Laravel никогда не увидит ваши "локальные" настройки.
Поначалу это кажется странным, но эта новая система по умолчанию, как правило, проще и менее подвержена проблемам, которые были у "пути 4,2", поскольку нет места для логических ошибок.
Если у меня не будет файла.env, как laravel узнает, какую среду я использую?
Это не будет работать вообще. в .env
файл также APP_KEY
декларация, без которой Ларавел не обойдется. Без .env
файл, вы получите 500 ошибок сервера.
Для Laravel версии 10 и выше:
Вы действительно можете использовать этот пакетsyamsoul/laravel-set-env
- Просто установите через композитор
composer require syamsoul/laravel-set-env
- Запустите эту команду:
php artisan souldoit:set-env
- Вам будет предложено вставить имя переменной и значение.
- Или можно сразу вставить имя переменной и значение в аргумент, например:
php artisan souldoit:set-env "MY_APP_NAME=My Application"