Как получить специфичные для среды файлы .env для dotenv (в Laravel 5)

Я только начал использовать Laravel 5, который использует библиотеку dotenv. Это использует файл .env в корне проекта, который устанавливает среду с этой строкой:

APP_ENV=local

В соответствии со всем, что я прочитал по этому вопросу, все другие специфические для окружающей среды конфигурации должны быть помещены в этот файл, поэтому пароли базы данных, URL и т. Д., Которые затем считываются в основной массив конфигурации следующим образом:

env('DB_HOST', 'localhost')

Хотя я чувствую, что это может работать для некоторых конкретных вещей, таких как пароли базы данных, которые вы, возможно, не захотите зафиксировать, я действительно хочу иметь возможность зафиксировать большинство или все мои различные значения среды для каждой среды.

Таким образом, я хочу, чтобы .env определил APP_ENV как «локальный», «промежуточный» или «производственный», а затем получил файл .local.env или .env.local, содержащий значения, которые я могу затем зафиксировать, и правильный файл. будет загружен на основе APP_ENV.

Это возможно? В Laravel 4 были каскадные конфигурационные массивы, которые казались намного более гибкими, но если у меня может быть экологический файл .env, я могу с этим смириться.

5

Решение

В конце концов это решено путем изменения app / Providers / ConfigServiceProvider.php. Этот файл добавляется в качестве заглушки в папку вашего приложения при создании проекта и предназначен для переопределения значений конфигурации.

Теперь он обрабатывает каскадные конфигурации, так что любые значения в config / local / app.php, например, будут переопределять config / app.php. Как сказано в комментарии ниже, он не обрабатывает соответствующие массивы в конфигурации среды и просто заменит их. Но я могу решить это, когда мне это нужно.

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Symfony\Component\Finder\Finder;

class ConfigServiceProvider extends ServiceProvider {

/**
* Overwrite any vendor / package configuration.
*
* This service provider is intended to provide a convenient location for you
* to overwrite any "vendor" or package configuration that you may want to
* modify before the application handles the incoming request / command.
*
* Modified 2014-01-20 to allow environment specific configs to be loaded
* from app/config/[environment]/ which will cascade over the base configs.
*
* @return void
*/
public function register()
{
$config = app('config');
$envPath = app()->configPath() . '/' . getenv('APP_ENV');

foreach (Finder::create()->files()->name('*.php')->in($envPath) as $file)
{
$configName = basename($file->getRealPath(), '.php');
$oldConfigValues = $config->get($configName);
$newConfigValues = require $file->getRealPath();

// Replace any matching values in the old config with the new ones.
// Doesn't yet handle matching arrays in the config, it will just replace them.
$config->set($configName, $newConfigValues + $oldConfigValues);
}
}

}
7

Другие решения

Ты не должен использование .env За все. Есть несколько вариантов.

Вариант 1 — использовать только .env для переменной

'default' => env('DB_CONNECTION'),

Вариант 2 — использовать только .env для переменной, но по умолчанию используется системная система

'default' => env('DB_CONNECTION', 'mysql'),

Вариант 3 — просто жестко закодируйте вашу переменную и не устанавливайте ее через .env

'default' => 'mysql',

Вариант 2, вероятно, является лучшим для большинства параметров конфигурации. Вы по-прежнему определяете (и фиксируете) опцию для вашей конфигурации в вашем git-репо, но вы можете легко переопределить ее в любом .env файл в будущем, если хотите.

Вариант 1 лучше всего подходит для паролей, ключей приложений и т. Д., Поэтому они никогда не используются в вашем git-репо.

Вариант 3 для нескольких переменных конфигурации, которые, как вы знаете, никогда не изменятся.

Заметка — опция каскадной папки конфигурации Laravel 4 больше не доступна.

5

Среду Laravel 5 легко настроить.

  1. Откройте корневую папку приложения и найдите «.env.example»,
  2. Скопируйте и переименуйте в «.env»,
  3. Пожалуйста, поместите файл .env в вашу среду,
  4. Если вы используете GIT, убедитесь, что вы не загружаете этот файл в свой GIT-репозиторий.

Для «полного объяснения» я пишу эту конфигурацию Вот.

Я цитирую разработчика Dotenv;

phpdotenv предназначен для сред разработки и обычно должен
не будет использоваться в производстве. В производстве, фактическая среда
переменные должны быть установлены так, чтобы не было никаких накладных расходов на загрузку
Файл .env по каждому запросу. Это может быть достигнуто с помощью автоматизированного
Процесс развертывания с помощью таких инструментов, как Vagrant, Chef или Puppet, или может быть
установить вручную с помощью облачных хостов, таких как Pagodabox и Heroku.

3
По вопросам рекламы [email protected]