最稳妥方式是 Yii::$app->user->identity->username,需先判空并确保 User 模型正确实现 IdentityInterface 且字段可访问;禁止重复查库或未判空直接取值。

在 Yii2.0.47 中,登录成功后获取用户名最稳妥的方式是直接从已加载的用户实体中读取,无需额外查库或依赖 session 手动解析。
推荐方式:用 Yii::$app->user->identity 取值
登录成功后,Yii 的 user 组件会把完整用户模型实例(如 app\models\User)缓存在 identity 属性中。只要模型里有可访问的用户名字段(比如 username、name 或 real_name),就能直接读取:
$username = Yii::$app->user->identity ? Yii::$app->user->identity->username : '';- 若字段名是
nick_name,就写->nick_name;若通过 getter 方法暴露,如getUsername(),则调用->getUsername() - 务必先判断
identity是否存在,避免未登录时出现 “Trying to get property of non-object” 错误
不建议的做法
这些方式效率低、易出错,或在特定场景下不可靠:
- 重复查库:
User::findOne(Yii::$app->user->id)—— 多一次数据库查询,浪费资源 - 硬编码字段又不校验:
Yii::$app->user->identity->username不加空判断 —— 登录态异常时直接报错 - 从 session 数组里手动取:
Yii::$app->session['username']—— 违反框架设计,维护成本高且不安全
确保模型支持的关键点
能顺利取到用户名,前提是你的 User 模型正确实现了 IdentityInterface,并且:
-
findIdentity()方法返回的是有效的 AR 实例(不是 null) - 登录时调用了
Yii::$app->user->login($identity),且传入的是该模型对象 - 用户名字段在数据库中存在,且在模型中可被公开访问(public 属性、getter 方法,或 ActiveRecord 自动映射)
视图中安全输出示例
在 layout 或页面中显示欢迎信息时,推荐这样写:
<?php echo Yii::$app->user->isGuest ? '请登录' : Html::encode(Yii::$app->user->identity->username ?? '未知用户'); ?>
其中 Html::encode() 防止 XSS,?? 提供兜底值,isGuest 是比判空更语义化的登录状态检查。


















