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

В 4-м ларавелле мы имели:

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

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

Но в Laravel 5 это изменилось на:

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

Также они исключили .окр. * строка в .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 узнает, какую среду я использую?

29

Решение

Вы можете сделать это точно так же, как в 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']

30

Другие решения

Для тех, кто только что обновился до 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() вспомогательная функция или напрямую через нативный PHP getenv() функция. Хотя вы должны сделать это только для заполнения ваших конфигурационных файлов (см. /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 значение)
12

Я просто хотел предложить свое решение для 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», если файл не найден.

Это все.

1

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

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

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

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

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

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

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

0
По вопросам рекламы [email protected]