Подтвердить что ты не робот

Какой правильный способ установить переменные 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 будет знать, какую среду я использую?

4b9b3361

Ответ 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)

Ответ 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.