应使用 yii::$app->user->isguest 判断登录状态,已登录时通过 yii::$app->user->identity->username 获取用户名;若 identity 为 null 需检查 findidentity() 实现、用户状态及 identityclass 配置。

在 Yii2.0.50 中,判断用户是否已登录并获取用户名,应直接使用框架内置的 user 组件,而不是手动查 session 或数据库——这是最安全、最符合框架规范的方式。
判断是否已登录(识别游客状态)
Yii::$app->user->isGuest 是唯一推荐的判断方式。它返回布尔值:true 表示未登录(游客),false 表示已登录。
- ✅ 正确用法:
if (!Yii::$app->user->isGuest) { /* 已登录逻辑 */ } - ❌ 避免手写:
Yii::$app->session->get('user_id')或isset($_SESSION['username'])——会绕过 user 组件,导致登出不同步、自动登录失效、RBAC 权限校验异常等问题
获取当前登录用户名
已确认登录后,通过 Yii::$app->user->identity 获取用户实体对象,再访问其属性:
-
Yii::$app->user->identity->username—— 获取用户名(前提是 User 模型中存在username字段且已正确映射) -
Yii::$app->user->identity->id—— 获取用户 ID(注意:不是Yii::$app->user->id,后者可能被错误重载或返回空) - 若需其他字段(如 nickname、email),直接调用
Yii::$app->user->identity->nickname即可,无需二次查询
常见报错与注意事项
运行时若出现 Trying to get property 'username' of non-object,说明 identity 为 null,本质是用户已登录但 findIdentity() 返回了 null(例如用户被删除、状态禁用、或主键类型不匹配)。请检查:
- User 模型中的
findIdentity($id)方法是否能根据 ID 正确查到有效、启用的用户记录 - 数据库中该用户的
status字段是否为启用状态(如status = 1),并在findIdentity()中做过滤 - 确保
config/web.php中'user' => ['identityClass' => 'app\models\User']指向正确的模型类
简单示例:控制器中安全取名
在控制器 action 内可这样写:
if (Yii::$app->user->isGuest) {
return $this->redirect(['site/login']);
}
$user = Yii::$app->user->identity;
$username = $user->username ?? '未知用户';
$userId = $user->id;
无需额外模型查询,identity 就是已加载的完整 User AR 实例。











