Какой правильный способ установить переменные 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 будет знать, какую среду я использую?
Ответы
Ответ 1
Вы можете сделать это точно так же, как в 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
В настоящий момент самая важная проблема, которую я вижу, - это то, что вам нужно помнить, когда вы собираетесь производить это .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']
Ответ 2
Для тех, кто только что обновился до версии 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()
для этого - это привело меня к гайкам, потому что homestead устанавливает переменную APP_ENV
в local
в php-fpm config /etc/php/7.0/fpm/php-fpm.conf
, и вы не можете ее изменить. env)
- при написании модульных тестов вы обычно наследуете
TestCase
, который устанавливает проверку APP_ENV
на переменную (через refreshApplication()
- используя putenv()
для переопределения значения по умолчанию local
)
Ответ 3
Вы можете проверить правильность настройки.
Как настроить множественную среду для Laravel 5 Разработчик Way
На основе Marcin Nabiałek я удалил часть его и поместил его в правильный файл, чтобы загрузить его правильно.
Ответ 4
Я просто хотел внести свое решение для 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", если файл не найден.
Вот и все.
Ответ 5
Тот факт, что по умолчанию у вас не может быть более одного файла .env
и что он исключен в .gitignore, является преднамеренным и предназначен для управления средами. Файл .env
не должен находиться в управлении версиями и должен быть настроен для каждой среды. .env
устанавливает среду и все переменные среды.
Итак, если у меня более двух окружений, я должен установить все из них в одном .ENV файле сейчас?
Нет. У вас будет файл .env
в каждом месте, где установлено ваше приложение. Разница заключается в том, что находится внутри этого файла.
Кроме того, поскольку файл .env
- это просто хранилище значений ключа, любые последующие объявления будут перезаписывать предыдущие. В вашем примере Laravel никогда не увидит ваши "локальные" настройки.
Сначала кажется странным, но эта новая система по умолчанию на самом деле обычно проще и менее подвержена проблемам, которые имеет "4.2-way", поскольку нет места для логических ошибок.
Если бы у меня не было файла .env, как laravel будет знать, какую среду я использую?
Это не сработало. В файле .env
также есть объявление APP_KEY
, с которым Laravel не будет работать. Без файла .env
вы получите ошибку сервера 500.