Я искал роль пользователя для вошедшего в систему пользователя, я не понимаю, как напечатать имя роли пользователя. Я попробовал это:
$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.
Я тоже проверил Получить роль пользователя & Конкретная роль пользователя
Таким образом, вы можете использовать для этого array_shift. Возвращается первый элемент массива E.g:
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);
}
$getRolesByUser = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());
$Role = array_keys($getRolesByUser)[0];