最直接安全的方式是先判断非访客再获取用户名:if (!yii::$app->user->isguest) {$username = yii::$app->user->identity->username;},需确保user模型实现identityinterface且username属性有效。

在 Yii2.0.54 中获取当前登录用户名,最直接、安全的方式是通过 Yii::$app->user->identity 获取已认证的用户对象,再访问其 username 属性。
确认用户已登录再取用户名
未登录时 Yii::$app->user->identity 为 null,直接访问会报错。务必先判断是否为访客:
if (!Yii::$app->user->isGuest) { $username = Yii::$app->user->identity->username; }- 推荐写法(避免重复调用):
$user = Yii::$app->user->identity;<br> if ($user !== null) {<br> $username = $user->username;<br> }
确保 User 模型正确实现 IdentityInterface
用户名能正常获取,前提是你的用户模型(如 app\models\User)实现了 IdentityInterface,且 username 是模型中定义的有效属性(通常对应数据库字段)。常见错误包括:
- 模型中没有声明
public $username;或未映射到数据库字段 -
findIdentity()方法返回了对象,但该对象不含username属性(比如用了asArray()查询) - 字段名不一致,例如数据库里叫
user_name,但代码中硬写$user->username
在视图中安全显示用户名
模板中建议用空合并或三元判断防错:
= Yii::$app->user->isGuest ? '游客' : Html::encode(Yii::$app->user->identity->username) ?>- 若需同时显示 ID 和用户名:
<?php $user = Yii::$app->user->identity; ?><br>= $user ? "$user->username (#$user->id)" : '未登录' ?>
不推荐的写法(易出错或低效)
以下方式应避免:
-
User::findOne(Yii::$app->user->id)—— 多一次数据库查询,且未处理isGuest边界情况 -
Yii::$app->user->identityClass::findOne(...)—— 硬编码类名,耦合度高,不利用框架自动注入 - 直接访问
Yii::$app->user->identity->username而不做空值检查 —— 生产环境可能触发 PHP Notice 或 Fatal Error











