【问题标题】:To Get Role Of A User - Yii2获取用户角色 - Yii2
【发布时间】:2015-12-08 15:49:51
【问题描述】:

我正在搜索登录用户的用户角色,但我不知道如何打印用户角色名称。我试过这个:

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

我还检查了Get User Role & Specific Role Of User

【问题讨论】:

  • U 可以用于这个 array_shift 例如: if(is_array($Role))array_shift($Role)->name;我不仅得到这个数组的第一个元素
  • 是的。这是正确的@NuriddinRashidov。这么多天以来,你就是我的救命恩人。很高兴你在我的名单上。你能把这个写成答案吗?
  • 首先@Nana 感谢您对我的评论的关注。我写了我的答案。

标签: php yii2 yii2-advanced-app yii2-basic-app yii2-user-roles


【解决方案1】:
$getRolesByUser = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());

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

【讨论】:

    【解决方案2】:

    用户可以拥有多个角色,而在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 已经返回了一个数组。

    或者,您可以按照建议的here 使用array_shift 或返回数组元素的键,因为它按名称索引(描述为here)。

    由于这种索引,您无法获取数组的0 元素(它根本不存在)。这就是你得到Undefined offset: 0 异常的原因。

    视图中的使用示例:

    <?php if (!Yii::$app->user->isGuest) { ?>
        <div class="user-role"><?= Yii::$app->user->identity->getRoleName() ?></div>
    <?php } ?>
    

    【讨论】:

    • 您好 Arogachev 先生:您的代码运行良好。非常感谢。我正在使用@Nuriddin 先生建议的array_shift。但是,我也会用这个。谢谢:)
    • @NanaPartykar array_shift 也可以,请阅读我的其他评论和解释。
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢。努里丁。 :)
    • 完全不是我的朋友。
    • Yii::$app-&gt;authManager-&gt;getRolesByUser() 总是返回数组,所以检查is_array 是多余的。 $role 不是不合适的名字,因为这个数组可以包含多个角色,最好命名为$roles。从array_shift 调用name 缺少IDE 中的代码突出显示。代码与PSR-2 不兼容(Yii2 遵循它并建议在您自己的代码中遵循它)。
    【解决方案4】:

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

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

    print_r(reset($Role));
    

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

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

    【讨论】:

    • 用户只有一个角色。而且,当我做print_r(reset($Role)); 时,我得到yii\rbac\Role Object ( [type] =&gt; 1 [name] =&gt; superadmin [description] =&gt; Super admin can do any operation in the application [ruleName] =&gt; [data] =&gt; [createdAt] =&gt; [updatedAt] =&gt; ) 。而且,当我喜欢 print_r(reset($Role['name']));print_r(reset($Role-&gt;name)); 时。我收到类似尝试修改非对象属性的错误请建议我如何使用name。谢谢
    • 是的,你用错了。由于reset 正在返回您的对象,因此只需在重置后调用它的任何属性即可。应该是print_r(reset($Role)-&gt;name)。可惜你之前没有注意到(甚至问过我),我是第一个回答 T-T
    • 对不起@Clyff 先生。请不要介意。谢谢你的努力。我很尴尬。
    • 哈哈哈好吧没关系,它发生了。但我建议你在你的项目中使用我的建议,是最快/最干净的。
    【解决方案5】:

    我认为最好的方法是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2013-02-18
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多