自定义区块保存时整段内容消失,日志里序列化函数返回空字符串,区块注释里有一个属性值是 null,共 2 处。日志里能对上时间点,这种反而好排。
序列化器遇到 null 属性会生成不合法的注释 JSON,解析失败后整块被丢弃。PHP 8.1 之后把未定义的数组键直接传进去,也会得到 null。这一点先确认清楚,后面就不用反复试。
$attrs = array_filter($attrs, fn($v) => $v !== null); echo serialize_block(["blockName" => "abc/card", "attrs" => $attrs, "innerHTML" => $html]);
「区块序列化失败」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:保存前把 null 属性过滤掉 缺省值用空字符串;在描述文件里给每个属性声明类型和默认值;补一条单元测试 用空属性跑一遍序列化。
结果对不对很好判断,保存后区块注释的 JSON 合法,内容不再丢失。
