Переопределил компонент
authManager и расширил класс DbManager:
<?php
namespace common\rbac;
use Yii;
use yii\rbac\DbManager as YiiDbManager;
class DbManager extends YiiDbManager
{
/**
* Выбранная роль
* @var
*/
protected $currentRole;
/**
* Немного переопределим инициализацию, чтобы узнать какую роль установил юзер
*/
public function init()
{
parent::init();
if (is_null($this->currentRole)) {
// Здесь проставим выбранную роль для юзера
// Пока что вручную, потом данный параметр будет подтягиваться из сессий, к примеру
$this->currentRole = 'buyer';
}
}
/**
* Определим какую из ролей пользователя выдать под текущий запрос
* @param $userId
* @return array
*/
public function getAssignments($userId)
{
// Доступные пользователю роли
$allAssignments = parent::getAssignments($userId);
// Какую роль он предпочёл в этот раз
$currentRole = $this->currentRole;
// Найдём в доступных ролях требуемую
$assignments = array_filter(
$allAssignments,
function ($key) use ($currentRole) {
return $key === $currentRole;
},
ARRAY_FILTER_USE_KEY
);
// Если роль не нашлась, то используем первую из доступных
if (empty($assignments)) {
$assignments = array_shift($allAssignments);
}
return $assignments;
}
}
Вышеприведённое решение со своей задачей справляется успешно.
Есть замечания? Буду благодарен за конструктивную критику или альтернативные варианты.