wprivalov
@wprivalov
Разрабатываю сайты на токарном станке)

[РЕШЕНО] Динамические БД и RBAC (DbManager) Yii2?

Всем привет. Сделал динамический провайдер компонентов по гайду Дмитрия Елисеева (https://elisdn.ru/blog/100/active-record-dynamic-db). В гайде рассматривается пример с подключением к разным базам данных в зависимости от пользователя. У меня немного другой формат, т.е подключение зависит от города. В общем все настроил и все прекрасно работает. За исключением RBAC. Т.е данные о ролях пользователей тянутся из основного подключения, потому что в классе DbManager, переменная public $db = 'db'; берет за основу компонент db, но ее можно переопределить из описания


/**
* var Connection|array|string the DB connection object or the application component ID of the DB connection.
* After the DbManager object is created, if you want to change this property, you should only assign it
* with a DB connection object.
* Starting from version 2.0.2, this can also be a configuration array for creating the object.
*/
public $db = 'db';


В конфиге
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=cg77777_db',
            'username' => 'cg77777_db',
            'password' => 'asdasd',
            'charset' => 'utf8',
        ],
        'dynamicServiceLocator' => [
            'class' => 'general\components\DynamicServiceLocator',
            'activeCity' => [
                'class' => 'general\components\ActiveCity',
                'default' => 0,
            ],
            'components' => [
                'db' => [
                    'class' => 'yii\db\Connection',
                    'dsn' => 'mysql:host=localhost;dbname=cg77777_{city}',
                    'username' => 'cg77777_{city}',
                    'password' => '{password}',
                    'charset' => 'utf8',
                ],
            ],
        ],
    ],
];


также в конфиге переопределил класс для authManager
'authManager' => [
    'class' => 'general\components\myDbManager',
],


а вот и сам класс
use yii\rbac\DbManager;

class myDbManager extends DbManager
{
    public $db = ['dynamicServiceLocator']; <---- как сюда правильно передать текущее подключение?
}


Но получаю ошибку "Setting unknown property: yii\db\Connection::0". Кто-нибудь реализовывал такой функционал? Как правильно скоромить нужное подключение authManager'у?
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
wprivalov
@wprivalov Автор вопроса
Разрабатываю сайты на токарном станке)
В общем изучив все тонкости теории относительности и после долгих танцев с бубном вокруг куклы Вуду и общения с миром духов нашел таки простейшее решение!

use Yii;
use yii\db\Connection;
use yii\di\Instance;
use yii\rbac\DbManager;

class myDbManager extends DbManager
{
    public function init()
    {
        parent::init();
        $this->db = Instance::ensure(Yii::$app->get('dynamicServiceLocator')->get('db'), Connection::className());
    }

}


Всего-то нужно было переопределить метод init() DbManager'a.
Расходимся парни :D
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы