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);

为什么这个要求来找我,因为登录用户没关系。但是,如果我想知道其他用户角色名称,那么我需要将索引名称传递到这里$Role[$roleName]->name

请帮助我访问这个“超级管理员”。我不知道如何获取它的索引名称。

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

我还检查了获取用户角色和用户的特定角色

4

5 回答 5

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 } ?>
于 2015-12-09T08:09:03.617 回答
3

所以你可以使用这个array_shift。它返回数组的第一个元素,例如:

if(is_array($Role))array_shift($Role)->name;
于 2015-12-09T07:30:17.033 回答
1

您的数组没有0索引。正如文档所说,该数组由角色名称索引。

因此,如果您拥有 100% 的所有用户,则将始终只有一个角色。你可以这样称呼它:

print_r(reset($Role));

但是如果用户可以有多个角色,你可以使用循环:

foreach ($Role as $each) {
    print_r($each);
}
于 2015-12-08T16:32:06.363 回答
1
$getRolesByUser = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());

$Role = array_keys($getRolesByUser)[0];
于 2017-08-23T16:12:50.540 回答
0

我认为最好的方法是:

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

PS上面的角色“管理员”。

于 2020-10-27T17:27:56.497 回答