[РЕШЕНО] Динамические базы данных для ActiveRecord

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
vprivaloff
Сообщения: 3
Зарегистрирован: 2020.08.11, 14:50

[РЕШЕНО] Динамические базы данных для ActiveRecord

Сообщение vprivaloff »

Всем привет. Сделал динамический провайдер компонентов по гайду Дмитрия Елисеева (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'у?
Последний раз редактировалось vprivaloff 2020.08.13, 01:52, всего редактировалось 1 раз.
vprivaloff
Сообщения: 3
Зарегистрирован: 2020.08.11, 14:50

Re: Динамические базы данных для ActiveRecord

Сообщение vprivaloff »

В общем изучив все тонкости теории относительности :shock: и после долгих танцев с бубном вокруг куклы вуду :ugeek: и общения с миром духов :cry: нашел таки простейшее решение!

Код: Выделить всё

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