Подтвердить что ты не робот

Параметры базы данных, основанные на окружающей среде, в Laravel?

Я перемещаюсь по структуре Laravel, но у меня возникают проблемы с настройками базы данных,

В частности, у меня установлена ​​моя среда, и они отлично работают для конфигурационного файла application.php, однако файл конфигурации database.php, похоже, не имеет эффекта.

Даже если у меня есть файл конфигурации database.php в моей папке окружения, он никогда не загружается, я помещаю в файл кучу недопустимых символов (клавиатурное пюре), чтобы заставить php выкидывать ошибку, но она никогда не попадает.

Не поддерживает ли Laravel настройки базы данных на базе среды? или я делаю это неправильно?

4b9b3361

Ответ 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