vr-shopxo-plugin/plan.md

3.5 KiB
Raw Blame History

Plan — 调试 "Undefined array key 'id'" PHP 错误

版本v1.0 | 日期2026-04-20 | Agentcouncil/BackendArchitect 关联提交bbea35d83feat: 保存时自动填充 template_snapshot


任务概述

调试 ShopXO 后台编辑票务商品goods_id=118保存时报错

Undefined array key "id"

根因代码位于 bbea35d83 新增的 AdminGoodsSaveHandle.php save_thing_end 时机。


任务清单

  • [Done: council/BackendArchitect] Task 1: 根因定位 — 逐行分析所有 "id" 访问位置
  • [Done: council/BackendArchitect] Task 2: Db::name() 表前缀问题 — ShopXO 插件表前缀行为确认
  • [Done: council/BackendArchitect] Task 3: 根因 1 — $r['id'] 空安全AdminGoodsSaveHandle 第 79 行)
  • [Done: council/BackendArchitect] Task 4: 根因 2 — find() 返回 null 的空安全AdminGoodsSaveHandle 第 72 行)
  • [Done: council/BackendArchitect] Task 5: 根因 3 — $config['template_id'] / selected_rooms 数据类型问题
  • [Done: council/BackendArchitect] Task 6: SeatSkuService::BatchGenerate 类似问题审计
  • [Done: council/BackendArchitect] Task 7: 修复方案汇总 + 建议修复优先级
  • [Done: council/BackendArchitect] Task 8: 将修复方案写入 reviews/BackendArchitect-on-Issue-13-debug.md

阶段划分

阶段 内容
Draft Task 1-6根因定位只读不修改代码
Review Task 7汇总所有根因给出修复建议
Finalize Task 8输出评审报告到 reviews/

依赖关系

  • Task 2、3、4、5 互不依赖,可并行分析
  • Task 6 依赖 Task 1 的结论(确认 BatchGenerate 中类似位置)
  • Task 7 依赖 Task 1-6 的结论
  • Task 8 依赖 Task 7

执行顺序

并行:
  Task 1: 读 AdminGoodsSaveHandle.php → 分析所有 $r['id'] / $template['seat_map'] / $r['id'] 访问
  Task 2: 读 BaseService::table() + ShopXO Db::name() 前缀逻辑
  Task 3: Task 1 完成后,确认 $r['id'] 空安全
  Task 4: Task 2 完成后,确认 find() null 处理
  Task 5: Task 1 完成后,确认 selected_rooms 类型匹配
串行:
  Task 6: 读 SeatSkuService.php → 检查 ensureAndFillVrSpecTypes / BatchGenerate 类似问题
  Task 7: 汇总根因,写修复建议
  Task 8: 输出 reviews/BackendArchitect-on-Issue-13-debug.md

关键文件(只读)

文件 关注点
shopxo/app/plugins/vr_ticket/hook/AdminGoodsSaveHandle.php save_thing_end 逻辑template_snapshot 填充代码
shopxo/app/plugins/vr_ticket/service/SeatSkuService.php BatchGenerate、ensureAndFillVrSpecTypes
shopxo/app/plugins/vr_ticket/service/BaseService.php table() 前缀方法
docs/VR_GOODS_CONFIG_SPEC.md vr_goods_config v3.0 JSON 格式
docs/PHASE2_PLAN.md 项目背景

根因结论(已验证)

  1. Primary99%: AdminGoodsSaveHandle.php:77$r['id'] 无空安全rooms 中缺少 id key 时崩溃
  2. Secondary5%: AdminGoodsSaveHandle.php:71find() 返回 null 后直接访问 $template['seat_map']
  3. Tertiary静默: AdminGoodsSaveHandle.php:77selected_rooms 类型不匹配,in_array 永远 false
  4. 已排除: 表前缀问题 — Db::name()BaseService::table() 均查询 vrt_vr_seat_templates,等价
  5. 已排除: SeatSkuService::BatchGenerate — 第 100 行已有 !empty() 空安全 fallback