最常用、最安全的方式是通过 yii::$app->user->identity 获取用户模型实例再访问 username 字段,并必须先用 isguest 判断是否登录,否则 identity 为 null 会报错;推荐写法:$username = yii::$app->user->isguest ? '' : yii::$app->user->identity->username。

在 Yii2.0.52 控制器中读取当前登录用户名,最常用、最安全的方式是通过 Yii::$app->user->identity 获取已认证的用户模型实例,再访问其用户名字段或 getter 方法。
确认用户已登录再读取
必须先判断是否为访客,避免调用空对象导致 PHP 错误:
if (!Yii::$app->user->isGuest) { $username = Yii::$app->user->identity->username; }- 若未登录,
Yii::$app->user->identity为null,直接访问会报 “Trying to get property 'username' of non-object” - 推荐写法:
$username = Yii::$app->user->isGuest ? '' : Yii::$app->user->identity->username;
确保 User 模型正确暴露 username
用户名能否读取,取决于你配置的 identityClass(如 app\models\User)是否支持访问 username:
- 如果数据库字段名就是
username,且模型继承自ActiveRecord,通常可直接访问 - 如果字段是
login_name或nick_name,请在 User 模型中添加 getter 方法:
public function getUsername() { return $this->login_name; } - 确保该方法返回非空、已过滤的数据(如 trim 后再返回)
控制器中常用写法示例
在 SiteController 或任意控制器 action 内:
-
基础读取(带空值防护):
$username = Yii::$app->user->isGuest ? '游客' : Yii::$app->user->identity->username; -
需要进一步处理时(如日志记录):
$user = Yii::$app->user->identity;
if ($user) { Yii::info("用户 {$user->username} 执行了操作", __METHOD__); } - 配合 RBAC 使用也不影响读取逻辑 —— RBAC 只管权限,用户名仍来自 identity 实例
不推荐的做法
以下方式效率低或存在安全隐患,应避免:
- 重复查库:
User::findOne(Yii::$app->user->id)—— identity 已加载,无需再查 - 从 session 直接取:
Yii::$app->session->get('username')—— 不可靠,未同步更新且易被篡改 - 跳过 isGuest 判断直接访问:
Yii::$app->user->identity->username—— 生产环境极易崩溃











