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

1

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

$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.

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

  • 1
    Вы можете использовать для этого array_shift, например: if (is_array ($ Role)) array_shift ($ Role) -> name; я не только получить первый элемент этого массива
  • 0
    Да уж. Это правильно @NuriddinRashidov. Ты мой спаситель со многих дней. Рад, что ты в моем списке. Можете ли вы написать это как ответ.
Показать ещё 1 комментарий
Теги:
yii2
yii2-advanced-app
yii2-basic-app
yii2-user-roles

4 ответа

3
Лучший ответ

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

if(is_array($Role))array_shift($Role)->name;
  • 0
    Благодаря. Нуриддин. :)
  • 1
    Совсем не мой друг.
Показать ещё 1 комментарий
6

Пользователь может иметь несколько ролей, а в 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 } ?>
  • 2
    Привет, господин Арогачев: Ваш код работает отлично. Большое спасибо. Я использовал array_shift, как это было предложено г-ном @Nuriddin. Но я тоже буду этим пользоваться. Спасибо :)
  • 1
    @NanaPartykar array_shift тоже работает, пожалуйста, прочитайте мои другие замечания и объяснения.
1

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

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

print_r(reset($Role));

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

foreach ($Role as $each) {
    print_r($each);
}
  • 0
    Пользователь имеет только одну роль. И, когда я делаю 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 . Спасибо
  • 0
    Да, вы использовали неправильно. Поскольку reset возвращал ваш объект, это был просто вопрос вызова любого его атрибута ПОСЛЕ сброса. Это будет print_r(reset($Role)->name) . Жаль, что вы не заметили (или даже не спросили меня), что раньше я был первым, кто ответил на TT
Показать ещё 2 комментария
0
$getRolesByUser = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());

$Role = array_keys($getRolesByUser)[0];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню