最直接安全的方式是 Yii::$app->user->identity->username,需确保 Identity 类正确暴露 username 属性或 getUsername() 方法,并在使用前检查 Yii::$app->user->isGuest 避免空对象错误。

在 Yii2 中,自定义 User 组件后,获取当前登录用户名最直接、安全的方式是通过 Yii::$app->user->identity->username(前提是你的 IdentityInterface 实现类中定义了 username 属性或 getter 方法)。
确保 Identity 类正确暴露 username
自定义 User 组件本身不存储用户数据,它依赖于你配置的 identityClass。你需要确认该类实现了 username 的访问能力:
- 如果数据库表字段就是
username,且已映射为公共属性或通过 ActiveRecord 自动支持,可直接访问; - 如果字段名是
login_name或nick_name,建议在 Identity 类中添加 getter:
public function getUsername()
{
return $this->login_name; // 或 $this->nick_name
}
这样 $user->identity->username 就能正常工作,无需修改调用代码。
在控制器或视图中安全获取用户名
使用前务必检查用户是否已登录,避免调用未登录用户的 identity 导致 NULL 错误:
-
控制器中:
Yii::$app->user->isGuest ? '游客' : Yii::$app->user->identity->username -
视图中(如 layout):
= Yii::$app->user->isGuest ? '请登录' : Html::encode(Yii::$app->user->identity->username) ?>
注意对输出做 Html::encode() 防 XSS,尤其当用户名可能含 HTML 字符时。
扩展 User 组件(可选):添加快捷方法
若频繁使用,可在自定义 User 组件类中增加一个安全的 getUsername() 方法:
class CustomUser extends \yii\web\User
{
public function getUsername()
{
return $this->isGuest ? null : $this->identity->username;
}
}
然后在 config/web.php 中配置:
'user' => [
'class' => 'app\components\CustomUser',
'identityClass' => 'app\models\User',
],
之后即可统一用 Yii::$app->user->getUsername(),逻辑更清晰、复用性更强。
常见问题排查
-
报错 “Trying to get property 'username' of non-object”:说明
identity是null,先确认登录是否成功,再检查findIdentity()是否返回了有效模型; - 用户名显示为空或异常:检查数据库字段值、Identity 类中的属性名是否拼写一致,或 getter 是否返回了预期值;
-
缓存导致旧用户名未更新:Yii2 默认会缓存 identity 对象,退出重新登录或调用
Yii::$app->user->switchIdentity(null)清除缓存后再登录。


















