在 yii2.0.50 中,最推荐的安全获取当前登录用户名方式是先判断登录状态再访问 identity,即 yii::$app->user->isguest ? '游客' : yii::$app->user->identity->username;需确保 identity 类实现 getusername() 方法并正确映射字段,或封装 customuser 组件统一处理。

在 Yii2.0.50 中,获取当前登录用户名最常用、最推荐的方式是通过 Yii::$app->user->identity->username,但这个写法成立的前提是:用户已登录、identity 对象存在、且模型中能正确访问到 username 属性或对应 getter 方法。直接硬写可能报错,关键在于“安全”和“可维护”。
确保 Identity 类支持 username 访问
Yii 的 user 组件本身不存用户名,它依赖你配置的 identityClass(如 app\models\User)提供数据。该类必须实现 IdentityInterface,并确保能返回用户名:
- 如果数据库字段名就是
username,且已映射为 ActiveRecord 的公共属性,可直接读取; - 如果字段是
login_name、nick_name或real_name,应在模型中添加标准 getter 方法:
public function getUsername() { return $this->login_name; } - 不要在调用侧硬改字段名,统一在模型里封装,保持上层代码稳定。
使用前必须检查是否已登录
Yii::$app->user->identity 在游客状态下为 null,直接访问会触发 “Trying to get property 'username' of non-object” 错误。所有地方都应先判断登录状态:
- 控制器中:
Yii::$app->user->isGuest ? '游客' : Yii::$app->user->identity->username - 视图中(带 XSS 防护):
= Yii::$app->user->isGuest ? '请登录' : Html::encode(Yii::$app->user->identity->username) ?> - 更简洁写法(PHP 7+):
= Yii::$app->user->identity->username ?? '游客' ?>,但注意这仍可能因identity为 null 而报错,所以??前建议先确保identity存在,或改用Yii::$app->user->identity ? ... : ...
封装一个安全的 getUsername() 方法(推荐)
若项目中多处需要用户名,建议扩展 User 组件,把判空逻辑收口:
- 新建
app\components\CustomUser类,继承\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(),语义清晰,不易出错。
不要在事件或登录回调里绕路查库
比如监听 EVENT_AFTER_LOGIN 时,应直接用 $event->identity->username。此时 $event->identity 已是完整加载的模型实例,无需再执行 User::findOne() 或读取 Yii::$app->user->identity —— 后者在某些异步或子请求上下文中可能尚未初始化。











