Конфигурация 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 легко настроить.

  1. Откройте корневую папку приложения и найдите ".env.example",
  2. Скопируйте и переименуйте в ".env",
  3. Пожалуйста, поместите файл.env в вашу среду,
  4. Если вы используете GIT, убедитесь, что вы не загружаете этот файл в свой GIT-репозиторий. Для "полного объяснения" я напишу эту конфигурацию здесь.

Под редакцией;

Я цитирую разработчика в файле readme.md его репозитория github;

phpdotenv предназначен для сред разработки и, как правило, не должен использоваться в производстве. В производственной среде фактические переменные среды должны быть установлены таким образом, чтобы при каждом запросе не требовалось загружать файл.env. Это может быть достигнуто с помощью автоматического процесса развертывания с помощью таких инструментов, как Vagrant, chef или Puppet, или может быть установлен вручную с помощью облачных хостов, таких как Pagodabox и Heroku.

Итак, вам нужно создать файл ".env" для каждой машины и не использовать файл ".env" на вашем рабочем сервере.

Другие вопросы по тегам