101142-修复用户操作记录管理页面报错.md 3.8 KB

修复用户操作记录管理页面报错

任务时间

  • 开始时间:2025年06月10日 11:42:10 CST
  • 完成时间:2025年06月10日 11:42:10 CST

问题描述

后台用户操作记录管理页面 http://kku_laravel.local.gd/admin/user-actions 报错:

  • 初始错误:Undefined constant App\Module\User\Enums\ACTION_TYPE::Ban
  • 后续错误:Cannot access offset of type App\Module\User\Enums\ACTION_TYPE on array

问题分析

  1. 枚举常量名称不匹配:数据库中存储的枚举值是首字母大写(如 Ban),但枚举定义中使用的是全大写(如 BAN
  2. 模型Cast处理:UserAction模型设置了枚举cast,从数据库读取的字符串被自动转换为枚举对象
  3. 控制器处理错误:在display函数中,期望字符串但实际接收到的是枚举对象

解决方案

1. 修改枚举常量定义

文件: app/Module/User/Enums/ACTION_TYPE.php

将枚举常量名从全大写改为首字母大写:

  • BANBan
  • RESTRICTRestrict
  • DELETEDelete
  • NORMALNormal

2. 更新控制器处理逻辑

文件: app/Module/User/AdminControllers/UserActionController.php

修改display函数,正确处理枚举对象:

// 操作类型显示
$grid->column('type', '操作类型')->display(function ($value) {
    $typeMap = [
        'Ban' => '封禁',
        'Restrict' => '禁止登录',
        'Delete' => '删除',
        'Normal' => '正常化',
    ];
    // $value 是 ACTION_TYPE 枚举对象,需要获取其 name 属性
    $typeName = $value instanceof ACTION_TYPE ? $value->name : $value;
    return $typeMap[$typeName] ?? $typeName;
});

// 状态显示
$grid->column('status', '状态')->display(function ($value) {
    $statusMap = [
        ACTION_STATUS::ING->value => '生效中',
        ACTION_STATUS::OK->value => '已生效',
        ACTION_STATUS::OUT_TIME->value => '已过期',
        ACTION_STATUS::END->value => '已结束',
    ];
    // $value 是 ACTION_STATUS 枚举对象,需要获取其 value 属性
    $statusValue = $value instanceof ACTION_STATUS ? $value->value : $value;
    return $statusMap[$statusValue] ?? '未知';
});

3. 更新服务层引用

文件: app/Module/User/Services/ActionService.php

更新所有ACTION_TYPE枚举常量的引用:

  • ACTION_TYPE::BANACTION_TYPE::Ban
  • ACTION_TYPE::RESTRICTACTION_TYPE::Restrict
  • ACTION_TYPE::DELETEACTION_TYPE::Delete
  • ACTION_TYPE::NORMALACTION_TYPE::Normal

修改文件列表

  1. app/Module/User/Enums/ACTION_TYPE.php - 修改枚举常量名称
  2. app/Module/User/AdminControllers/UserActionController.php - 修复控制器处理逻辑
  3. app/Module/User/Services/ActionService.php - 更新枚举引用

验证结果

✅ 用户操作记录管理列表页面正常显示 ✅ 操作类型正确显示(封禁、禁止登录、删除、正常化) ✅ 状态正确显示(生效中、已生效、已过期、已结束) ✅ 详情页面正常显示 ✅ 筛选功能正常工作

技术要点

  1. 枚举Cast机制:Laravel模型的枚举cast会自动将数据库字符串转换为枚举对象
  2. 枚举属性访问
    • 对于纯枚举(无值):使用 $enum->name 获取常量名
    • 对于有值枚举:使用 $enum->value 获取枚举值
  3. 类型检查:使用 instanceof 检查变量类型,确保兼容性

提交信息

修复用户操作记录管理页面枚举常量错误

- 修改ACTION_TYPE枚举常量名称,从全大写改为首字母大写(BAN->Ban, RESTRICT->Restrict等)
- 更新UserActionController中的枚举引用,处理模型cast后的枚举对象
- 更新ActionService中的枚举引用
- 修复页面显示错误:Cannot access offset of type ACTION_TYPE on array
- 确保枚举常量名称与数据库存储值一致