最直接、安全且推荐的方式是通过 yii::$app->user->identity->username 获取当前登录用户名,前提是 identity 模型中存在该字段;也可用 yii::$app->user->id 获取用户 id,性能更优。

在 Yii2.0.47 中做权限校验时,若需获取当前登录用户名,最直接、安全且推荐的方式是通过 Yii::$app->user->identity 获取用户模型实例,再访问其 username 属性。
✅ 正确获取方式(推荐)
只要用户已成功登录(非游客状态),可直接使用:
-
Yii::$app->user->identity->username—— 获取用户名(前提是 identity 模型中存在username字段) -
Yii::$app->user->id—— 获取用户 ID(轻量、无需加载完整模型)
注意:该方式复用了已认证的用户实体,不额外查库,性能好、语义清晰。
⚠️ 常见错误写法(应避免)
以下写法虽可能“运行成功”,但存在隐患:
-
User::findOne(Yii::$app->user->id)->username:重复查询数据库,浪费资源;若用户已登出或 session 失效,findOne()可能返回 null,引发 PHP Notice 或 Fatal Error -
Yii::$app->user->identityClass::findIdentity(Yii::$app->user->id)->username:绕过框架缓存机制,逻辑冗余,且未处理 identity 为 null 的情况
? 权限校验中结合用户名使用的建议
在 RBAC 权限判断(如 can())前后,如需记录日志、审计或动态生成提示信息,可这样安全使用:
- 先检查是否已登录:
if (!Yii::$app->user->isGuest) - 再取用户名:
$username = Yii::$app->user->identity->username; - 如需兼容字段名差异(比如用
nickname或real_name),建议在 User 模型中定义一个getDisplayName()方法统一处理
? 补充说明
Yii2.0.47 仍沿用标准 IdentityInterface 实现逻辑。确保你的 identityClass(通常是 app\models\User)已正确实现 findIdentity() 和公开属性(如 username),且数据库表中该字段非空或有默认值。若用户名字段名不是 username,请按实际字段名访问,例如 ->nickname。











