必须先用 yii::$app->user->isguest 判断访客状态,为 true 时 identity 为 null,不可直接访问 username;安全写法是 $username = !yii::$app->user->isguest ? yii::$app->user->identity->username : '游客'。

访客状态下无法获取用户名,因为 Yii::$app->user->identity 为 null,直接调用 ->username 会触发 PHP 致命错误(Trying to get property 'username' of non-object)。
判断访客状态是前提
必须先确认用户是否已登录,再尝试读取用户名:
- 使用
Yii::$app->user->isGuest判断——这是唯一可靠方式,它综合了 authKey 验证、过期检查、findIdentity()返回结果等完整逻辑 - 不要依赖 session 数据(如
Yii::$app->session->get('id'))或手动查数据库,否则会绕过 Yii 的认证生命周期,导致自动登录失效、登出不同步等问题 - 若
isGuest === true,说明当前无有效身份,identity不存在,此时任何对identity->xxx的访问都应跳过或提供默认值
安全读取用户名的写法
在确保非访客的前提下,再访问用户名属性:
- 推荐写法:
$username = !Yii::$app->user->isGuest ? Yii::$app->user->identity->username : '游客'; - 更健壮写法(防 identity 异常返回):
$identity = Yii::$app->user->identity; $username = $identity ? $identity->username : '游客'; - 避免这种写法:
Yii::$app->user->identity->username(未判空)、User::findOne(Yii::$app->user->id)(冗余查询,且访客时id可能为 null 或 0)
注意 RESTful API 场景的特殊性
API 接口默认禁用 session,enableSession => false,其用户认证依赖 access token 或 Bearer Token:
- 访客判断仍用
isGuest,逻辑一致 - 但需确保 API 的
user组件配置了正确的identityClass和enableAutoLogin => true,否则即使 token 有效,identity也可能无法加载 - 若 API 中用户名用于日志或审计,建议统一封装一个工具方法,内部处理访客 fallback,避免各处重复判空
不复杂但容易忽略:访客不是“没登录”,而是“没有可解析的有效身份”。一切基于 identity 的操作,都必须以 isGuest 或 identity !== null 为安全边界。











