Конфигурация 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
каталог? Но если нет, где их хранить? Я не знаю, является ли это ошибкой или функцией, поэтому, если кто-то знает об этом больше, пожалуйста, дайте мне подсказку.
4 ответа
Хотя в документации для Laravel dev (5.0) есть информация, что конфигурация будет каскадной, это не так. Я протестировал его около 2 недель назад, и на данный момент кажется, что единственный способ получить разные значения для сред - это использовать файл ENV, в который вы помещаете пользовательские значения для текущей среды. Размещение настроек в каталогах не будет работать, как раньше, однако возможно, что это изменится или, возможно, уже изменилось за последние 2 недели.
Есть пакет, который возвращает систему каскадных настроек обратно в Laravel 5.
Отказ от ответственности: я автор.
Для меня это выглядит как дефект в ветке Laravel 5 dev. Я смог обойти это, добавив обнаружение и настройку среды вручную. Этот код делает это.
'default' => $app->environment()=='testing'?'sqlite':'mysql',
Среду Laravel 5 легко настроить.
- Откройте корневую папку приложения и найдите ".env.example",
- Скопируйте и переименуйте в ".env",
- Пожалуйста, поместите файл.env в вашу среду,
- Если вы используете GIT, убедитесь, что вы не загружаете этот файл в свой GIT-репозиторий. Для "полного объяснения" я напишу эту конфигурацию здесь.
Под редакцией;
Я цитирую разработчика в файле readme.md его репозитория github;
phpdotenv предназначен для сред разработки и, как правило, не должен использоваться в производстве. В производственной среде фактические переменные среды должны быть установлены таким образом, чтобы при каждом запросе не требовалось загружать файл.env. Это может быть достигнуто с помощью автоматического процесса развертывания с помощью таких инструментов, как Vagrant, chef или Puppet, или может быть установлен вручную с помощью облачных хостов, таких как Pagodabox и Heroku.
Итак, вам нужно создать файл ".env" для каждой машины и не использовать файл ".env" на вашем рабочем сервере.