直接原因是用户未登录或identity未正确加载,并非版本bug;需检查isGuest状态、User模型getUsername()实现、login()传参有效性及user组件配置。

直接原因是用户未登录或 identity 未正确加载,不是版本 bug。Yii2.0.45 中 Yii::$app->user->identity 返回 null,说明认证状态为空,需从登录逻辑和模型实现两方面排查。
确认用户是否已登录
未登录时 identity 必然为 null,必须先判断登录状态:
- 用
Yii::$app->user->isGuest判断:返回true表示游客,此时不能访问identity - 安全写法示例:
Yii::$app->user->isGuest ? '游客' : Yii::$app->user->identity->username - 控制器中避免直接调用
->identity->xxx,务必前置判空
检查 User 模型是否正确定义 getUsername()
Yii2 要求 identity 类实现 IdentityInterface,其中 getUsername() 方法决定用户名来源:
- 若数据库字段是
username,且已映射为公共属性,可直接返回$this->username - 若字段名是
real_name或nick_name,必须在User模型中显式重写该方法:
- 不依赖字段名自动推断;不重写该方法,框架可能 fallback 到
getId()或空字符串
验证 login() 调用是否传入有效 identity 实例
登录成功的关键是 Yii::$app->user->login($identity) 中的 $identity 必须是非 null 的完整模型对象:
- 检查登录逻辑(如
LoginForm::login())是否调用了User::findByUsername()并返回了有效模型 - 临时加调试代码:
var_dump($identity); die;确认它不是null,且包含预期字段值 - 常见错误:查询失败返回
null,却仍执行login(null),导致后续identity始终为空
排除配置与环境干扰
某些配置会导致身份信息无法持久化:
- 确认
user组件配置中'identityClass'指向正确的模型类(如app\models\User) - 检查 session 是否正常工作(尤其是 CLI 环境下无 session,
identity不会保留) - 开发环境下若启用了调试模式(
YII_DEBUG = true),虽不影响逻辑,但日志膨胀可能掩盖真实错误,建议关闭后复现


















