Конфигурация Laravel 5 - окружающая среда и переопределение
Я установил новую копию Laravel 5.
Моя функция detectEnvironment определяется следующим образом:
$app->detectEnvironment(function()
{
return 'local';
return getenv('APP_ENV') ?: 'production';
});
В config\local
я создал файл database.php
:
<?php
return [
'nothing' => 'new',
];
Я запускаю php artisan clear-compiled
.
Мой index
метод WelcomeController
определяется следующим образом:
public function index(Application $app)
{
echo $app->environment();
var_dump($app['config']['database']);
//echo $app['config']['database'];
return view('welcome');
}
Приложение было импортировано следующим образом: use Illuminate\Foundation\Application;
В результате получается:
local array(1) { ["nothing"]=> string(3) "new" }
тогда как я ожидал бы, что Laravel будет каскадным конфигурационным файлом с производственным (с файлом config\database.php
по умолчанию.
Странно то, что даже если я прокомментирую строку return 'local';
снова запустив php artisan clear-compiled
, она показывает:
production array(1) { ["nothing"]=> string(3) "new" }
поэтому он всегда загружает содержимое файла database.php
(это из локальной папки) и переопределяет основной файл database.php
. Он отлично работает, когда я изменяю это имя файла, например, aaa.php
.
Является ли это ошибкой или, возможно, конфигурацией среды не следует хранить внутри каталога config
? Но если нет, где их хранить? Я не знаю, если это ошибка или функция, поэтому, если кто-нибудь знает об этом, пожалуйста, дайте мне ключ.
Ответы
Ответ 1
Хотя в документации для Laravel dev (5.0) есть информация о том, что конфигурация будет каскадом, это не так. Я тестировал его примерно 2 недели назад, и кажется, что в настоящий момент единственным способом иметь разные значения для сред является использование файла ENV, в который вы помещаете пользовательские значения для текущей среды. Ввод настроек в каталоги не будет работать так, как он работал, однако возможно, что он изменится или, возможно, уже был изменен за последние 2 недели.
Ответ 2
Там пакет, который возвращает каскадную конфигурационную систему в Laravel 5.
Отказ от ответственности: я автор.
Ответ 3
Для меня это похоже на дефект в ветке Laravel 5 dev. Я смог обойтись, добавив ручную обнаружение и настройку среды. Этот код делает это.
'default' => $app->environment()=='testing'?'sqlite':'mysql',
Ответ 4
Легко настроить среду Laravel 5.
- Откройте корневую папку приложения и найдите ".env.example",
- Скопируйте и переименуйте в ".env",
- Пожалуйста, поместите файл ".env" в свою среду,
- Если вы используете GIT, убедитесь, что вы не нажимаете этот файл в репозиторий GIT.
Для "полного объяснения" я пишу эту конфигурацию здесь.
Edited;
Я цитирую разработчика в его файле readme.md для репозитория github;
phpdotenv предназначен для среды разработки и обычно должен не используется в производстве. В производстве фактическая окружающая среда переменные должны быть установлены так, чтобы не было накладных расходов на загрузку .env по каждому запросу. Это может быть достигнуто с помощью автоматизированного процесс развертывания с помощью таких инструментов, как Vagrant, chef или Puppet, или может быть установить вручную с облачными узлами, такими как Pagodabox и Heroku.
Итак, вам нужно создать файл ".env" на машину и не использовать файл ".env" на вашем рабочем сервере.