По мере того, как я начал создавать больее полнофункциональные пакетов Laravel, я понял, что хочу давать пользователям возможность задавать параметры подключения к БД, отличные от тех, которые используются по умолчанию в изначальном окружении Laravel. Один такой случай произошел, когда я начинал создавать свой пакет для FAQ. Итак, давайте посмотрим, как мы можем это сделать.
После разговора с Тэйлором я узнал, что хитрость заключается в методе PHPgetConnection
, который находится в PHPIlluminate\Database\Eloquent\Model
. Если вы заглянете в код, то увидите, что все запросы расположены вверху в Illuminate\Database\Connection. Сначала я подумал, что для создания нового подключения мне придется определить какой-то набор полей. Но затем я узнал, что PHPConnectionResolver
создает любые подключения, перечисленные в массиве database.connections.
Зная об этом, мы можем начать с добавления в конфигурацию подключения к БД на лету.
В методе boot нашего сервис-провайдера, мы вызовем PHP$this->setConnection();
, чтобы немного абстрагироваться от этой логики. Напишем setConnection:
public function setConnection()
{
$connection = Config::get('laravel-faq::database.default');
if ($connection !== 'default') {
$wardrobeConfig = Config::get('laravel-faq::database.connections.'.$connection);
} else {
$connection = Config::get('database.default');
$wardrobeConfig = Config::get('database.connections.'.$connection);
}
Config::set('database.connections.faq', $wardrobeConfig);
}
А в src/config/database.php нашего пакета:
return array(
'default' => 'default',
'connections' => array(
'sqlite' => array(
'driver' => 'sqlite',
'database' => app_path().'/database/faq.sqlite',
'prefix' => '',
),
// Прочие подключения
),
),
);
Этот код будет проверять подключение к БД по умолчанию в нашей конфигурации, и если оно задано как PHP'default'
, то наше приложение возьмёт подключение к БД по умолчанию для приложения и скопирует его в массив подключений с ключом PHP'faq'
. Если в PHPdefault
у пакета заданы другие БД, то приложение возьмет эти подключения и сохранит их в подключение 'faq'.
Теперь, когда мы сохранили новое подключение, мы зададим его для всех наших моделей в пакете. Для этого изменим функцию PHPgetConnection
в базовой модели. Сначала создадим в нашем пакете %%(t)BaseModel.php%:
class BaseModel extends \Illuminate\Database\Eloquent\Model
{
public function getConnection()
{
return static::resolveConnection('faq');
}
}
При создании модели наследуем их от этой новой PHPBaseModel
. Все ваши подключения будут инициализироваться из подключения PHP'faq'
вместо подключения по умолчанию. Теперь мы все настроили и имеем большую гибкость, чем когда-либо!