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

На четвертом уровне мы имели:

$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 узнает, какую среду я использую?

6 ответов

Решение

Вы можете сделать это точно так же, как в 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.. после изучения этого в течение последнего часа я мог бы также добавить некоторую дополнительную информацию здесь:

  • 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 значение)

Вы можете проверить, как правильно настроить. Как настроить несколько сред для разработчиков Laravel 5 Way

Основываясь на Marcin Nabiałek, я удалил некоторую его часть и поместил в соответствующий файл, чтобы загрузить ее правильно.

Я просто хотел поделиться своим решением для 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 ошибок сервера.

Для Laravel версии 10 и выше:

Вы действительно можете использовать этот пакетsyamsoul/laravel-set-env

  1. Просто установите через композитор
      composer require syamsoul/laravel-set-env
  1. Запустите эту команду:
      php artisan souldoit:set-env
  • Вам будет предложено вставить имя переменной и значение.
  • Или можно сразу вставить имя переменной и значение в аргумент, например:
      php artisan souldoit:set-env "MY_APP_NAME=My Application"
Другие вопросы по тегам