Получить роль пользователя — 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.

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

1

Решение

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

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

Другие решения

Пользователь может иметь несколько ролей, и в 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 } ?>
6

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

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

print_r(reset($Role));

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

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

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

$Role = array_keys($getRolesByUser)[0];
1
По вопросам рекламы [email protected]