Может войдёшь?
Черновики Написать статью Профиль

Гибкость БД пакетов Laravel - модели Eloquent

перевод

По мере того, как я начал создавать больее полнофункциональные пакетов Laravel, я понял, что хочу давать пользователям возможность задавать параметры подключения к БД, отличные от тех, которые используются по умолчанию в изначальном окружении Laravel. Один такой случай произошел, когда я начинал создавать свой пакет для FAQ. Итак, давайте посмотрим, как мы можем это сделать.

После разговора с Тэйлором я узнал, что хитрость заключается в методе PHPgetConnection, который находится в PHPIlluminate\Database\Eloquent\Model. Если вы заглянете в код, то увидите, что все запросы расположены вверху в Illuminate\Database\Connection. Сначала я подумал, что для создания нового подключения мне придется определить какой-то набор полей. Но затем я узнал, что PHPConnectionResolver создает любые подключения, перечисленные в массиве database.connections.

Зная об этом, мы можем начать с добавления в конфигурацию подключения к БД на лету.

В методе boot нашего сервис-провайдера, мы вызовем PHP$this->setConnection();, чтобы немного абстрагироваться от этой логики. Напишем setConnection:

PHP
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 нашего пакета:

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%:

PHP
class BaseModel extends \Illuminate\Database\Eloquent\Model
{
    public function 
getConnection()
    {
        return static::
resolveConnection('faq');
    }
}

При создании модели наследуем их от этой новой PHPBaseModel. Все ваши подключения будут инициализироваться из подключения PHP'faq' вместо подключения по умолчанию. Теперь мы все настроили и имеем большую гибкость, чем когда-либо!

Как вы считаете, полезен ли этот материал? Да Нет

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.