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



В laravel 4 у нас было:



$env = $app->detectEnvironment(array(
'local' => array('homestead')
));


По умолчанию.



Но в laravel 5 он изменен на:



$env = $app->detectEnvironment(function()
{
return getenv('APP_ENV') ?: 'production';
});


Кроме того, они исключили .ОКР.* строка В.пример, вот он:



.env


И добавил файл .ОКР.пример:



APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=homestead
DB_PASSWORD=homestead


Итак, если у меня есть более 2 сред, я должен установить все из них в одном .энв файл сейчас? Например:



APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456


Если бы у меня не было .env file, как laravel узнает, какую среду я использую?

740   5  

5 ответов:

Вы можете сделать это точно так же, как в 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 based environment detection в основном файле env (по умолчанию .env файл, вам нужно добавить:

APP_ENV=local

Конечно local вот локальная среда, Вы можете изменить ее на production или dev

На данный момент самая важная проблема, которую я вижу, заключается в том, что вам нужно помнить, когда вы идете на производство, чтобы изменить содержимое этого файла .env с APP_ENV=local на APP_ENV=production, поэтому, на мой взгляд, гораздо лучший метод-это старый метод по умолчанию, основанный на именах ПК.

Теперь ENV файлы. Если вы используете env based environment detection, вы должны поместить в свой ENV-файл только:

APP_ENV=local

Теперь вы можете создавать отдельные файлы ENV для ваши различные среды, например:

.местный.env :

 MY_DB=testdb

.производство.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.

/ / править Су.. после копания в этом в течение последнего часа я мог бы также добавить некоторую дополнительную информацию здесь:

  • Ларавель использует .env файлы для конфигурации
  • по умолчанию файл ".env " в корневой каталог приложения загружается
  • Вы можете получить доступ к значениям внутри них .env файлы через вспомогательная функция env() или непосредственно через собственную функцию PHP getenv(). Хотя вы должны сделать это только для заполнения ваших конфигурационных файлов (см. /config/*.php), потому что они могут быть кэшированы.
  • the .env-файлы загружаются в классDetectEnvironment . Я нашел это полезным во время отладки, чтобы установить точки останова. Пожалуйста, обратите внимание на строку (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();: так как она использует load() любое значение среды, которое уже было задано, не будет перезаписано! (вам придется использовать overload() сделать это-это свело меня с ума , потому что homestead устанавливает переменную APP_ENV в local в конфигурации php-fpm /etc/php/7.0/fpm/php-fpm.conf, и вы не можете изменить ее через .env файл)
  • при написании модульных тестов вы обычно наследуете от TestCase, который устанавливает переменную APP_ENV в testing (via refreshApplication() -- использование putenv() для переопределения значения по умолчанию local)

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

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

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

Итак, если у меня есть более 2 сред, нужно ли мне устанавливать все из них в единственном экземпляре .энв файл сейчас?

Нет. У вас будет .env файл в каждом месте, где установлено приложение. Разница заключается в том, что находится внутри этого файла.

Кроме того, поскольку файл .env является просто хранилищем значений ключей, любые последующие объявления будут перезаписывать предыдущие. В вашем примере Laravel никогда не увидит ваши "локальные" настройки.

Поначалу это кажется странным, но эта новая система по умолчанию на самом деле проще и менее подвержена проблемам, которые были/есть у" 4.2 way", поскольку здесь нет места для логики ошибки.

Если бы у меня не было .env file, как laravel узнает, какую среду я использую?

Он вообще не будет работать. В файле .env также есть объявление APP_KEY, без которого Laravel не будет работать. Без файла .env вы получите ошибку сервера 500.

Comments

    Ничего не найдено.