Параметры базы данных, основанные на окружающей среде, в Laravel?
Я перемещаюсь по структуре Laravel, но у меня возникают проблемы с настройками базы данных,
В частности, у меня установлена моя среда, и они отлично работают для конфигурационного файла application.php, однако файл конфигурации database.php, похоже, не имеет эффекта.
Даже если у меня есть файл конфигурации database.php в моей папке окружения, он никогда не загружается, я помещаю в файл кучу недопустимых символов (клавиатурное пюре), чтобы заставить php выкидывать ошибку, но она никогда не попадает.
Не поддерживает ли Laravel настройки базы данных на базе среды? или я делаю это неправильно?
Ответы
Ответ 1
Вы можете установить настройки базы данных (и любые другие настройки конфигурации) с помощью среды.
Для Laravel 3 (для Laravel 4 и Laravel 5 см. ниже):
Во-первых - вам нужно определить $environments
в paths.php
и установить его примерно так:
$environments = array(
'development' => array('*.dev'),
'production' => array('*.com'),
);
Laravel автоматически ищет эту переменную, и если она установлена, будет использоваться связанная конфигурация.
Обычно у вас есть папка config
, с настройками, такими как database.php
и auth.php
Теперь просто создайте новую папку для каждого Laravel_Env
, который вы планируете использовать (например, разработка). В итоге у вас будет такая структура папок:
/application
/config
/development
database.php
/production
database.php
application.php
config.php
database.php
...
user_agents.php
Вы заметите, что я включил database.php
только в каждую подпапку. Laravel всегда будет загружать настройки конфигурации по умолчанию, а затем переопределять их с помощью любых настраиваемых конфигураций из настроек среды.
Наконец, в вашем файле development/database у вас будет что-то вроде этого:
<?php
return array(
'default' => 'mysql'
);
p.s. Я просто проверил это на текущей версии 3.2.12 сборки Laravel - и это определенно работает.
Бонусный совет: Вы также можете автоматически настроить среду для Artisan, поэтому вам не нужно включать среду вручную в каждую командную строку! Для этого:
-
Вам нужно знать свое "имя хоста", на котором запущен Artisan. Чтобы узнать - временно отредактируйте artisan.php
в корневой папке и добавьте var_dump(gethostname());
в строку 2 (т.е. Выше всего).
-
Запустите php artisan
из командной строки. Вы получите строковый дамп с вашим именем хоста. В моем случае его "TSE-Win7",
-
Удалите изменения в файле artisan.php
-
Добавьте ваше имя хоста (т.е. "TSE-Win7" ) в среду.
У вас должно получиться что-то вроде этого:
$environments = array(
'development' => array('*.dev', 'TSE-Win7'),
'production' => array('*.com'),
);
Artisan теперь будет работать с вашей средой разработки. Если вы развернете сервер на живом сервере, заново запустите эти шаги, чтобы получить имя хоста() для сервера, и вы можете настроить конкретную конфигурацию 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
.
Посмотрите этот laracast, конфиг полностью объяснен.
Ответ 2
если вы используете мастер (командная строка для laravel), каждая команда, которую вам нужно добавить
artisan bla bla bla --env=Development
или
artisan bla bla bla --env=Production
Ответ 3
Вот как я настроил его для своих нужд.
Мне лично нужны 4 разных конфигурации:
- localhost (Mac OSX) -/Library/WebServer/Documents/www/my-domain.com/development/
- dev.my-domain.com(VPS) -/var/www/my-domain.com/development/
- test.my-domain.com(VPS) -/var/www/my-domain.com/test/
- my-domain.com(VPS) -/var/www/my-domain.com/web/
Так как все 4 среды имеют отличительную структуру каталогов, я могу использовать константу php magic __ 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;
}
Если мы работаем на одной машине или несколько, шансы иметь один и тот же путь к различным средам очень тонкие.
Или, я думаю.:)
Ответ 4
Как настроить конфигурацию, специфичную для среды теперь находится в официальных документах Laravel. Я бы рекомендовал использовать их метод вместо принятого ответа:
Часто бывает полезно иметь разные значения конфигурации на основе среда, в которой работает приложение. Например, вы можете хотите использовать другой драйвер кэша на своей локальной машине разработки чем на производственном сервере. Это легко сделать с помощью на основе среды.
Просто создайте папку в каталоге config, которая соответствует вашему имя среды, например, локальное. Затем создайте файлы конфигурации вы хотите переопределить и указать параметры для этой среды. Для Например, чтобы переопределить драйвер кэша для локальной среды, вы создаст файл 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, вы можете определить свое имя хоста с помощью команды терминала имени узла.
Если вам требуется более гибкое обнаружение среды, вы можете пройти Закрытие метода 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...
}
Ответ 5
Laravel 5
Используйте DotEnv, подробно описанный в документы Laravel здесь.
Laravel 4
Мы используем метод Jeffrey Way, рекомендованный в этом уроке Laracasts.
-
Создайте каталоги config
для каждой среды.
/app
/config
/local
database.php
/production
database.php
-
Задайте переменную среды на рабочем сервере. Google для наилучшего подхода на вашей производственной платформе. Например, вот большие предложения для Ubuntu, Dreamhost, и Heroku. Мы добавили одну строку в /etc/environment
:
ENV=production
-
Добавьте это закрытие в /bootstrap/start.php
. С помощью этой настройки любой сервер, не имеющий переменной среды ENV
, по умолчанию будет иметь конфигурацию среды local
.
$env = $app->detectEnvironment(
function () {
return getenv('ENV') ? : 'local';
}
);
Ответ 6
Я работаю над этим сегодня, изо всех сил пытаюсь разобраться, как лучше всего выполнять настройки окружающей среды для базы данных. В конце концов, попробовав несколько методов, я полностью согласен с @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>'
]
]
]);
Ответ 7
В Laravel 3 для обнаружения среды это было:
Request:env()
Что бы вернуть то, что было идентифицировано в массиве окружений, найденном в файле paths.php.
Как упоминалось ранее в Laravel 4, он теперь:
App:: environment()
Ответ 8
Мой способ сделать это!
$env = $app->detectEnvironment( function() {
if ( file_exists('../.env.local.php') ) {
return 'local';
}
if ( file_exists('../.env.beta.php') ) {
return 'beta';
}
return 'production';
} );
Ответ 9
Если вы пытаетесь использовать Laravel в среде Windows, проверьте настройки в файле .env в папке верхнего уровня для вашего проекта Laravel - это переопределит любые настройки базы данных, которые у вас есть в config/database.php
Ответ 10
Если вы находитесь на Laravel 4 вот суть, которая поможет вам шаг за шагом. Кредиты на @ "Shift Exchange" отвечают за то, что я создал его.