Я перемещаюсь по структуре 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, поэтому вам не нужно включать среду вручную в каждую командную строку! Сделать это:
Вы должны знать свое «имя хоста», на котором запущен 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 теперь будет работать с вашей средой разработки. Если вы развернете сервер на живом сервере, заново запустите эти шаги, чтобы получить имя хоста () для сервера, и вы можете настроить конкретную конфигурацию мастера только для сервера!
Для 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 разных конфигурации:
Поскольку все 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... }
Используйте подход DotEnv, подробно описанный в документах Laravel .
Мы используем метод Джеффри Пути, рекомендованный на этом уроке Ларакастис .
Создавайте каталоги 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» для того, чтобы я мог его создать.