Получить роль пользователя - Yii2

Я искал роль пользователя для вошедшего в систему пользователя, я не понимаю, как напечатать имя роли пользователя. Я попробовал это:

$Role = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());

Когда я сделал print_r($Role); Я получил это:

Array ( [superadmin] => yii\rbac\Role Object ( [type] => 1 [name] => superadmin [description] => Super admin can do any operation in the application [ruleName] => [data] => [createdAt] => [updatedAt] => ) )

Я искал конкретное имя роли, но у меня не было доступа

Array ( [superadmin] => yii\rbac\Role Object ........)
           ^ unable to access this name.

При наборе текста print_r($Role[0]->name); Я получаю ошибку как

Уведомление PHP - yii\base\ErrorException

Неопределенное смещение: 0

И, если мне так нравится (значит, вручную $rolename к индексу массива) Работает.

$roleName = 'superadmin';

print_r($Role[$roleName]->name);

Почему это требование пришло ко мне, потому что для авторизованного пользователя все нормально. Но если я хочу узнать другое имя роли пользователя, тогда мне нужно передать это индексное имя $Role[$roleName]->name

Пожалуйста, помогите мне получить доступ к этому 'superadmin'. Я не понимаю, как получить индексное имя этого.

Array ( [superadmin] => yii\rbac\Role Object
               ^ unable to access this name.

Я также проверил Получить роль пользователя и определенную роль пользователя

4 ответа

Решение

Таким образом, вы можете использовать для этого array_shift. Возвращается первый элемент массива, например:

if(is_array($Role))array_shift($Role)->name;

Пользователь может иметь несколько ролей, и в authManager нет способа получить только одну роль для пользователя.

Вы можете использовать этот код в случае одной роли (я бы рекомендовал поместить его в User модель для поддержания чистоты кода):

/**
 * Returns user role name according to RBAC
 * @return string
 */
public function getRoleName()
{
    $roles = Yii::$app->authManager->getRolesByUser($this->id);
    if (!$roles) {
        return null;
    }

    reset($roles);
    /* @var $role \yii\rbac\Role */
    $role = current($roles);

    return $role->name;
}

Не нужно проверять массив, потому что getRolesByUser уже возвращает массив.

В качестве альтернативы вы можете использовать array_shift как предложено здесь или вернуть ключ элемента массива, потому что он проиндексирован по именам (описано здесь).

Из-за такой индексации вы не можете получить 0 элемент массива (его просто не существует). Вот почему ты получил Undefined offset: 0 исключение.

Пример использования в представлении:

<?php if (!Yii::$app->user->isGuest) { ?>
    <div class="user-role"><?= Yii::$app->user->identity->getRoleName() ?></div>
<?php } ?>

Ваш массив не имеет 0 индекс. Как сказано в документации, массив индексируется по именам ролей.

Таким образом, если у вас есть 100%, все пользователи всегда будут иметь только одну роль. Вы можете назвать это так:

print_r(reset($Role));

Но если пользователь может иметь несколько ролей, вы можете использовать цикл для этого:

foreach ($Role as $each) {
    print_r($each);
}

На мой взгляд, лучший способ:

if (array_key_exists('Admin', \Yii::$app->authManager->getRolesByUser(Yii::$app->user->id))) { ... }

PS выше для роли "Админ".

$getRolesByUser = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());

$Role = array_keys($getRolesByUser)[0];
Другие вопросы по тегам