Shopware 6中扩展order_delivery运行时字段后无法读取,如何解决?
问题分析与解决方案
你遇到的错误核心原因是错误地给持久化字段添加了Runtime()标记,同时可能存在缓存未清理的问题,具体解决步骤如下:
1. 修正实体扩展代码,移除Runtime()标记
Runtime()标记的作用是标记字段为非持久化运行时字段,这类字段不会映射到数据库列,也不会被实体的属性访问机制识别。你的字段已经存在于order_delivery表中并存储了数据,属于持久化字段,完全不需要这个标记。
修改后的代码:
#[Autoconfigure(tags: ['shopware.entity.extension'])] class OrderDeliveryReferenceExtension extends EntityExtension { public function extendFields(FieldCollection $collection): void { $collection->add( (new IntField('reference_number', 'referenceNumber')) ->addFlags(new ApiAware()), ); } public function getDefinitionClass(): string { return OrderDeliveryDefinition::class; } }
2. 清理Shopware缓存
Shopware会缓存实体定义,修改扩展后必须清理缓存才能让新的字段映射生效,执行以下命令:
bin/console cache:clear bin/console system:cache:clear
3. 验证扩展激活状态
确保你的自定义扩展已经在Shopware后台启用,或者在config/bundles.php中正确注册了对应的Bundle。
4. 可选:字段类型校验
检查数据库中reference_number列的类型是否与IntField匹配:
- 如果数据库列是
INT类型,当前代码没问题 - 如果是
BIGINT类型,需要将IntField替换为BigIntField
完成以上步骤后,$this->delivery->get('referenceNumber')就能正常读取字段值了。
内容的提问来源于stack exchange,提问作者lubart
相关产品推荐
相关产品推荐

