Я искал роль пользователя для входа в систему, я не получаю, как печатать имя роли пользователя. Я пробовал это:
$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);
Почему это требование пришло ко мне, потому что для входа в систему User It Ok. Но, если я хочу узнать другое имя роли пользователя, мне нужно, чтобы это имя индекса передавалось здесь $Role[$roleName]->name
Пожалуйста, помогите мне получить доступ к этому "суперадмину". Я не получаю, как получить индексное имя.
Array ( [superadmin] => yii\rbac\Role Object
^ unable to access this name.
Я также проверил роль пользователя и конкретную роль пользователя
Таким образом, вы можете использовать для этого array_shift. Он возвращает первый элемент массива Eg:
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 } ?>
array_shift
тоже работает, пожалуйста, прочитайте мои другие замечания и объяснения.
В вашем массиве нет индекса 0
. Как говорится в документации, массив индексируется именами ролей.
Итак, если у вас есть 100%, у всех пользователей будет только одна роль. Вы могли бы назвать это следующим образом:
print_r(reset($Role));
Но если у пользователя может быть несколько ролей, вы можете использовать для этого цикл:
foreach ($Role as $each) {
print_r($each);
}
print_r(reset($Role));
Я получаю yii\rbac\Role Object ( [type] => 1 [name] => superadmin [description] => Super admin can do any operation in the application [ruleName] => [data] => [createdAt] => [updatedAt] => )
. И когда мне нравится print_r(reset($Role['name']));
или print_r(reset($Role->name));
, Я получаю сообщение об ошибке типа Попытка изменить свойство не-объекта. Пожалуйста, предложите мне, как получить name
. Спасибо
reset
возвращал ваш объект, это был просто вопрос вызова любого его атрибута ПОСЛЕ сброса. Это будет print_r(reset($Role)->name)
. Жаль, что вы не заметили (или даже не спросили меня), что раньше я был первым, кто ответил на TT
$getRolesByUser = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());
$Role = array_keys($getRolesByUser)[0];