071042-修复宠物技能处理错误.md 2.7 KB

修复宠物技能处理错误

任务时间

  • 开始时间:2025年06月07日 10:42:08 CST
  • 完成时间:2025年06月07日 10:45:00 CST

问题描述

执行宠物技能处理命令 php artisan pet:process-active-skills --sync 时出现错误:

TypeError: Cannot access offset of type string on string at /data/wwwroot/nusuus/kknongchang/kku_laravel/app/Module/Pet/Logic/PetAutoSkillLogic.php:690

问题分析

错误发生在 PetAutoSkillLogic.phprecordSkillStatistics 方法中。问题原因:

  1. PetActiveSkill 模型的 config 字段虽然定义了 'config' => 'array' 的cast
  2. 但在创建记录时使用了 json_encode() 存储配置,导致数据库中存储的是JSON字符串
  3. 在某些情况下,Laravel的cast转换可能失败,导致 $activeSkill->config 返回字符串而不是数组
  4. 当代码尝试使用数组语法访问字符串时,就会出现 Cannot access offset of type string on string 错误

解决方案

recordSkillStatistics 方法中添加类型检查和转换逻辑,确保 config 字段始终为数组类型:

protected function recordSkillStatistics(PetActiveSkill $activeSkill, string $actionType, array $statistics): void
{
    $config = $activeSkill->config;

    // 确保config是数组类型
    if (!is_array($config)) {
        // 如果是字符串,尝试解析JSON
        if (is_string($config)) {
            $config = json_decode($config, true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                $config = [];
            }
        } else {
            $config = [];
        }
    }

    // 其余逻辑保持不变...
}

修改文件

  • app/Module/Pet/Logic/PetAutoSkillLogic.php - 修复 recordSkillStatistics 方法的类型安全问题

测试结果

修复后重新执行命令:

php artisan pet:process-active-skills --sync

执行成功,输出:

开始处理宠物激活技能...
使用同步模式处理...
宠物激活技能处理完成(同步模式)

日志显示正常处理了1个激活技能,没有任何错误。

技术要点

  1. 类型安全:在处理可能为不同类型的数据时,应该添加类型检查
  2. 一致性:保持与模型中其他方法(如 updateLastCheckTimegetLastCheckTime 等)一致的类型安全处理逻辑
  3. 容错性:当JSON解析失败时,提供合理的默认值(空数组)

提交信息

修复宠物技能处理中config字段类型错误问题

- 在recordSkillStatistics方法中添加config字段类型检查
- 确保config字段始终为数组类型,避免字符串类型导致的TypeError
- 修复Cannot access offset of type string on string错误
- 保持与模型中其他方法一致的类型安全处理逻辑