В 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 будет знать, какую среду я использую?
Вы можете сделать это точно так же, как в 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
На данный момент самая важная проблема, которую я вижу, – это то, что вам нужно помнить, когда вы собираетесь производить этот файл APP_ENV=local
с 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
вы можете modfiy:
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()
или напрямую через собственную функцию getenv()
PHP. Хотя вы должны сделать это только для заполнения ваших конфигурационных файлов (см. /config/*.php
), поскольку они могут быть кэшированы . (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
: Поскольку он использует load()
любое значение среды, которое уже было установлено, не будет перезаписано! (Вам пришлось бы использовать overload()
чтобы сделать это – это заставило меня APP_ENV
потому что homestead устанавливает переменную APP_ENV
в local
конфигурацию php- /etc/php/7.0/fpm/php-fpm.conf
config /etc/php/7.0/fpm/php-fpm.conf
и вы не можете ее изменить через .env файл) TestCase
, который устанавливает переменную APP_ENV
для тестирования (через refreshApplication()
– с помощью putenv()
для переопределения local
значения по умолчанию) Вы можете проверить, как правильно настроить. Как настроить несколько окружений для Laravel 5 Developers Way
Основываясь на Марчине Набиалеке , я удалил часть его и поместил его в надлежащий файл, чтобы загрузить его правильно.
Я просто хотел внести свой вклад в решение для 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
устанавливает вашу среду и все переменные среды.
Итак, если у меня более двух окружений, я должен установить все из них в одном .ENV-файле сейчас?
Нет. У вас будет файл .env
в каждом месте, где установлено ваше приложение. Разница заключается в том, что находится внутри этого файла.
Кроме того, поскольку .env
файл – это просто хранилище ключей, любые последующие объявления будут перезаписывать предыдущие. В вашем примере Laravel никогда не увидит ваши «локальные» настройки.
Сначала кажется странным, но эта новая система по умолчанию на самом деле вообще проще и менее подвержена проблемам, которые имеет «4.2-й способ», поскольку нет логических ошибок.
Если бы у меня не было файла .env, как laravel будет знать, какую среду я использую?
Это не сработало. В файле .env
также есть объявление APP_KEY
, с которым Laravel не будет работать. Без файла .env
вы получите ошибку сервера 500.