这个故障最容易浪费时间,因为编辑页看起来完全正常:数据库里的值能显示,输入新值也没有校验错误,点击保存还提示成功;再次打开却恢复为空。

我不先看资源模型,而是直接保存一次 Network 里的 POST。假设请求实际是:

general[name]=New Name

控制器却读取 $request->getParam('name'),拿到的自然是空值。页面回显来自 DataProvider,提交来自 UI Component;两条链路可以一条正确、一条错误。

四个名字必须形成同一条路径

  1. form 的 namespace;
  2. fieldset 的 dataScope;
  3. field 的 source/dataScope;
  4. DataProvider 返回数组的根节点。

如果 DataProvider 返回 [$id => ['general' => ['name' => 'A']]],XML 与保存逻辑就应按 general.name 对齐。不要为了让页面显示而在 getData() 中复制两份值,这会把读取问题藏起来。

<item name="dataScope" xsi:type="string">general.name</item>

保存时先记录经过白名单后的 payload 键,不要记录敏感值。字段完全没进请求,查组件绑定;请求中有值但控制器读不到,查层级;控制器读到而数据库没变,再看 repository、resource model 和事务。

一个容易忽略的覆盖

prepareMeta()、Modifier Pool 或另一个模块可以在运行时改字段配置。浏览器中的 UI registry 才是最终结果,不能只看自己模块的 XML。修复后分别测试新建和编辑,因为两者的 provider 数据结构经常不同;再提交空值,确认系统按业务规则清空或拒绝,而不是悄悄保留旧值。