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