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