直接访问yii::$app->user->identity->username报错,绝大多数情况是用户未登录或identity为空;必须先用!yii::$app->user->isguest判断登录状态,再确认identity非空,否则会触发“trying to get property 'username' of non-object”错误。

直接访问 yii::$app->user->identity->username 报错,绝大多数情况不是代码写错了,而是用户未登录或身份对象为空。关键先确认登录状态,再检查 identity 是否可访问。
检查是否已登录(避免调用 identity)
Yii2 中未登录时 yii::$app->user->identity 为 null,直接取 ->username 会触发 “Trying to get property 'username' of non-object” 错误。
- 务必先用
!Yii::$app->user->isGuest判断是否已登录 - 推荐写法:
if (!Yii::$app->user->isGuest && Yii::$app->user->identity) {
$username = Yii::$app->user->identity->username;
} - 不要省略
identity的非空判断——某些自定义 UserIdentity 实现可能返回 null,即使已登录
确认 User 类是否正确配置
报错也可能源于 user 组件未指向有效的 Identity 类,或该类缺少 username 属性。
- 检查
config/web.php中'user'组件配置:
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
], - 打开对应
User模型,确认它继承自yii\web\IdentityInterface并实现了username属性(通常通过 public $username 或 getter 方法提供) - 若使用数据库字段映射,确保表中存在
username字段,且未被重命名或忽略在attributes()中
调试 identity 加载失败的具体原因
如果已登录但 identity 仍为 null,说明认证后无法加载用户数据,常见于查找逻辑异常。
- 在
User::findIdentity($id)方法中加日志或断点,确认是否被调用、是否返回有效模型实例 - 检查主键类型:若
findIdentity()接收的是字符串 ID(如 UUID),但方法里按整型查询,会导致查不到 - 验证
User::getId()返回值是否与 session 中存储的 user id 一致(类型和值都需匹配) - 运行
php yii cache/flush-all清除 auth 缓存,排除缓存脏数据干扰
注意开发环境下的特殊陷阱
本地开发(尤其 macOS + MAMP/Homebrew MySQL)有时会间接影响登录流程,比如数据库连接失败导致 AuthManager 初始化异常,进而使 login() 返回 false 却无明显提示。
- 查看 PHP 错误日志或 Yii 日志(
runtime/logs/app.log),搜索 “User::findIdentity”、“login failed”、“auth manager” 等关键词 - 临时在
SiteController::actionLogin()登录成功后加一行:
var_dump(Yii::$app->user->isGuest, Yii::$app->user->identity); die;
直观确认登录动作是否真正生效 - 若用 Redis 缓存 session,确认 Redis 连接正常,否则登录态无法持久化











