最常用且安全的方式是先判断Yii::$app->user->isGuest,再通过Yii::$app->user->identity->username获取;需确保User模型实现IdentityInterface、数据库含username字段且用户已激活登录。

在 Yii2.0.14 高级模板中获取当前已登录用户的用户名,最常用且安全的方式是通过 Yii::$app->user->identity 访问用户模型实例,再读取其 username 属性。前提是用户已成功登录,且 User 模型实现了 IdentityInterface 并正确映射了数据库字段。
确认 User 模型实现 IdentityInterface
高级模板默认使用 common\models\User,该类必须实现 \yii\web\IdentityInterface(通常已继承 \yii\db\ActiveRecord 并实现必要方法)。重点检查以下两点:
-
findIdentity($id)和findIdentityByAccessToken($token)方法是否返回有效的 ActiveRecord 实例 -
username字段是否存在于数据库表(如user表)且在模型中可访问(非被$safeAttributes或scenarios()拦截)
在控制器或视图中安全获取用户名
直接使用前建议先判断是否为登录态,避免调用未登录用户的 identity 导致空对象异常:
- 获取用户名(推荐写法):
Yii::$app->user->isGuest ? '游客' : Yii::$app->user->identity->username - 若需在视图中显示:
= Yii::$app->user->isGuest ? '请登录' : Html::encode(Yii::$app->user->identity->username) ?> - 在控制器逻辑中使用(例如记录操作日志):
$username = Yii::$app->user->isGuest ? null : Yii::$app->user->identity->username;
常见问题排查
如果获取不到用户名,请逐项核对:
- 用户是否真的已登录?检查登录接口是否返回成功、session 是否有效、
auth_key是否匹配 -
User模型的tableName()是否指向正确的数据表(如{{%user}}),且表中存在username字段 - 是否启用了自定义
user组件配置?检查common/config/main.php中'user' => [...]的identityClass是否指向正确的类 - 数据库用户记录的
status字段是否为启用状态(如10)?findIdentity()默认会过滤非激活用户
扩展:获取其他用户信息
一旦能拿到 identity 实例,即可直接访问模型所有公开属性或 getter 方法:
Yii::$app->user->identity->email-
Yii::$app->user->identity->getId()(主键 ID) -
Yii::$app->user->identity->created_at(需字段存在且未被隐藏)
不复杂但容易忽略。


















