Параметры базы данных, основанные на окружающей среде, в Laravel?

Я перемещаюсь по структуре Laravel, но у меня возникают проблемы с настройками базы данных,

В частности, у меня есть настройки моей среды, и они отлично работают для конфигурационного файла application.php, однако файл конфигурации database.php, похоже, не имеет никакого эффекта.

Даже если у меня есть файл конфигурации database.php в моей папке окружения, он никогда не загружается, я помещаю в файл кучу недопустимых символов (клавиатурное пюре), чтобы заставить php выкидывать ошибку, но она никогда не попадает.

Laravel не поддерживает настройки базы данных на базе среды? или я делаю это неправильно?

Вы можете установить настройки базы данных (и любые другие настройки конфигурации) по средам.

Для Laravel 3 (для Laravel 4 и Laravel 5 см. Ниже):

Во-первых – вам нужно определить $environments в вашем paths.php и установить его примерно так:

 $environments = array( 'development' => array('*.dev'), 'production' => array('*.com'), ); 

Laravel автоматически ищет эту переменную, и если она установлена, будет использоваться связанная конфигурация.

Обычно у вас есть папка с настройками, такие как database.php и auth.php

Теперь просто создайте новую папку для каждого Laravel_Env вы планируете использовать (например, Development). В итоге у вас будет такая структура папок;

 /application /config /development database.php /production database.php application.php config.php database.php ... user_agents.php 

Вы заметите, что я включил только database.php в каждую подпапку. Сначала Laravel загружает настройки конфигурации по умолчанию, а затем переопределяет их с помощью любых настраиваемых конфигураций из настроек среды.

Наконец, в вашем файле разработки / базы данных у вас будет что-то вроде этого;

 <?php return array( 'default' => 'mysql' ); 

ps Я просто тестировал это на текущей версии 3.2.12 сборки Laravel – и это определенно работает.

Бонусный совет: вы также можете автоматически настроить среду для Artisan, поэтому вам не нужно включать среду вручную в каждую командную строку! Сделать это:

  1. Вы должны знать свое «имя хоста», на котором запущен Artisan. Чтобы узнать – временно отредактируйте artisan.php в корневой папке и добавьте var_dump(gethostname()); к строке 2 (т.е. выше всего).

  2. Запустите php artisan из командной строки. Вы получите строковый дамп с вашим именем хоста. В моем случае его «TSE-Win7»;

  3. Удалить изменения в файле artisan.php

  4. Добавьте свое имя хоста (т. Е. «TSE-Win7») в среду.

Вы должны получить что-то вроде этого:

 $environments = array( 'development' => array('*.dev', 'TSE-Win7'), 'production' => array('*.com'), ); 

Artisan теперь будет работать с вашей средой разработки. Если вы развернете сервер на живом сервере, заново запустите эти шаги, чтобы получить имя хоста () для сервера, и вы можете настроить конкретную конфигурацию мастера только для сервера!

Для Laravel 4:

Стандартная среда всегда является production . Но в вашем файле start.php вы можете определить дополнительные среды.

  $env = $app->detectEnvironment(array( 'local' => array('your-machine-name'), )); 

В Linux и Mac вы можете определить свое hostname по типу hostname в своем терминале – оно выведет имя вашего компьютера. В Windows поместите dd(gethostname()); в начале вашего файла routes.php – и запустите веб-сайт один раз – он покажет вам текущее имя компьютера.

Чтобы получить текущую среду как переменную в вашем приложении, прочитайте здесь этот ответ. Laravel 4: как я могу получить значение среды?

Для Laravel 5:

В корневом каталоге есть один файл конфигурации, называемый .env . Посмотрите этот ларакаст , конфиг объяснен полностью.

если вы используете мастер (командная строка для laravel), каждая команда, которую вам нужно добавить

 artisan bla bla bla --env=Development 

или

 artisan bla bla bla --env=Production 

Вот как мне это настроить для моих нужд.

Мне лично нужны 4 разных конфигурации:

  1. localhost (Mac OSX) – /Library/WebServer/Documents/www/my-domain.com/development/
  2. dev.my-domain.com (VPS) – /var/www/my-domain.com/development/
  3. test.my-domain.com (VPS) – /var/www/my-domain.com/test/
  4. my-domain.com (VPS) – /var/www/my-domain.com/web/

Поскольку все 4 среды имеют отличительную структуру каталогов, я могу использовать магическую константу php __DIR__ для извлечения каталога приложения, а затем использовать функцию strpos () для простой проверки и возврата соответствующей среды. Он также позаботится о среде Artisan, не нужно вручную вводить среду или добавлять имена машин.

Внутри

самозагрузки / start.php

Добавить функцию обратного вызова

 $env = $app->detectEnvironment(function(){ $haystack = __DIR__; // Catch the directory path // Set the booleans (remove the first '/', else strpos() will return 0) $isLocal = strpos($haystack, 'Library/WebServer/Documents/www/my-domain.com/development/'); $isDevelopment = strpos($haystack, 'var/www/my-domain.com/development/'); $isTest = strpos($haystack, 'var/www/my-domain.com/test/'); $isProduction = strpos($haystack, 'var/www/my-domain.com/web/'); // Set the environments if ($isLocal) $environment = "local"; if ($isDevelopment) $environment = "development"; if ($isTest) $environment = "test"; if ($isProduction) $environment = "production"; // Return the appropriate environment return $environment }); 

Другая альтернатива

Мы также можем установить и захватить все значения сразу в массив и запустить цикл foreach.

Совет. Так как мы используем функцию strpos () , которая проверяет положение первого вхождения данного значения против $ haystack и возвращает номер позиции. Нам не нужно поставлять весь путь, мы можем просто добавить отличительное значение от каждого пути, чтобы выполнить работу.

 // Check the boolean, if true set to given value, else set NULL $environments[] = strpos($haystack, "Library") ? 'local' : NULL; $environments[] = strpos($haystack, "develop") ? 'development': NULL; $environments[] = strpos($haystack, "test") ? 'test' : NULL; $environments[] = strpos($haystack, "web") ? 'production' : NULL; // Loop through each, if not null then we have our environment foreach ($environments as $environment) { if(!is_null($environment)) return $environment; } 

Независимо от того, работаем ли мы на одной машине или несколько, шансы иметь один и тот же путь в разных средах очень тонкие.

Или я думаю. 🙂

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

Часто бывает полезно иметь разные значения конфигурации на основе среды, в которой работает приложение. Например, вы можете использовать другой драйвер кэша на своей локальной машине разработки, чем на рабочем сервере. Это легко сделать, используя конфигурацию на основе среды.

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

 <?php return array( 'driver' => 'file', ); 

Примечание. Не используйте «тестирование» в качестве имени среды. Это зарезервировано для модульного тестирования. Обратите внимание, что вам не нужно указывать все параметры, которые находятся в базовом файле конфигурации, но только параметры, которые вы хотите переопределить. Файлы конфигурации среды будут «каскадироваться» над базовыми файлами.

Затем нам нужно проинструктировать структуру, как определить, в какой среде она работает. Стандартная среда всегда является производством. Однако вы можете настроить другие среды в файле bootstrap / start.php в корне вашей установки. В этом файле вы найдете вызов $ app-> detectEnvironment. Массив, переданный этому методу, используется для определения текущей среды. При необходимости вы можете добавить другие среды и имена машин в массив.

 <?php $env = $app->detectEnvironment(array( 'local' => array('your-machine-name'), )); 

В этом примере «local» – это имя среды, а «your-machine-name» – имя хоста вашего сервера. В Linux и Mac вы можете определить свое имя хоста с помощью команды терминала имени узла.

Если вам требуется более гибкое обнаружение среды, вы можете передать Closure методу detectEnvironment, позволяя вам реализовать обнаружение среды, но вы хотите:

 $env = $app->detectEnvironment(function() { $domain = explode('.', $_SERVER['HTTP_HOST']); switch($domain[0]) { case 'localhost': case 'localhost:8080': case 'dev': return 'development'; break; case 'mysite': default: return 'production'; break; } }); 

Вы можете получить доступ к текущей среде приложения с помощью метода среды:

Доступ к текущей прикладной среде

 $environment = App::environment(); 

Вы также можете передать аргументы методу среды, чтобы проверить, соответствует ли среда заданному значению:

 if (App::environment('local')) { // The environment is local } if (App::environment('local', 'staging')) { // The environment is either local OR staging... } 

Laravel 5

Используйте подход DotEnv, подробно описанный в документах Laravel .

Laravel 4

Мы используем метод Джеффри Пути, рекомендованный на этом уроке Ларакастис .

  • Создавайте каталоги config для каждой среды .

     /app /config /local database.php /production database.php 
  • Установите переменную среды на вашем производственном сервере. Google для наилучшего подхода на вашей производственной платформе. Например, вот отличные предложения для Ubuntu , Dreamhost и Heroku . Мы добавили одну строку в /etc/environment :

     ENV=production 
  • Добавьте это закрытие в /bootstrap/start.php . При такой настройке любой сервер, не ENV переменной окружения ENV , по умолчанию будет настроен на local конфигурацию среды.

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

Сегодня я работаю над этим, изо всех сил пытаюсь понять, как лучше всего выполнять настройки окружающей среды для базы данных. В конце концов, попробовав несколько методов, я полностью согласен с @ troy-harvey, что рекомендация Джеффри Уэйя сделать это лучше (для меня, по крайней мере). Одна вещь, которую я добавлю к этому, и то, что меня так сильно задержало сегодня ( и поправьте меня, если я ошибаюсь ), что вам нужно получить доступ к настройкам, которые вы пытаетесь перетащить в свой файл настроек окружающей среды, их соответствующими массива. Я начал возвращать простой массив:

 return [ 'database' => '<db_name>', 'username' => '<db_user>', 'password' => '<db_pass>', ]; 

в app/config/staging/database.php . Это не имело никакого эффекта, и после того, как много царапин на голове поняли, что вам нужно получить доступ к массиву, как он представлен в app/config/database.php , вот так:

 <?php return [ 'connections' => [ 'mysql' => [ 'database' => '<db_name>', 'username' => '<db_user>', 'password' => '<db_pass>' ] ] ]; 

По крайней мере, так мне удалось получить мои настройки.

Добавляя это здесь, если кто-то еще изо всех сил пытается это решить. После осознания я понял, насколько очевидна ошибка, которую я совершал.

Отредактировано 01 июля 2014 года

Дополнительным комментарием к этому является то, что с 4.1 Laravel поставляется с вспомогательной функцией append_config () для добавления конфигураций окружения в основной конфигурационный массив.

Это было бы похоже на приведенный выше пример:

 <?php return append_config([ 'connections' => [ 'mysql' => [ 'database' => '<db_name>', 'username' => '<db_user>', 'password' => '<db_pass>' ] ] ]); 

В Laravel 3 для обнаружения окружающей среды это было:

 Request:env() 

Что бы вернуть все, что было определено в массиве сред, найденном в файле paths.php.

Как упоминалось ранее в Laravel 4, это сейчас:

 App:: environment() 

Мой способ сделать это!

 $env = $app->detectEnvironment( function() { if ( file_exists('../.env.local.php') ) { return 'local'; } if ( file_exists('../.env.beta.php') ) { return 'beta'; } return 'production'; } ); 

Если вы пытаетесь использовать Laravel в среде Windows, проверьте настройки в файле .env в папке верхнего уровня для вашего проекта Laravel – это переопределит любые настройки базы данных, которые у вас есть в config / database.php

Если вы находитесь на Laravel 4, вот суть, которая поможет вам шаг за шагом. Кредиты на ответ @ «Shift Exchange» для того, чтобы я мог его создать.