Shopware 6:如何让addExtension添加的自定义数据在Store API返回中显示
解决方案:让动态添加的产品扩展在Store API中返回
核心问题
你通过ProductListingResultEvent动态添加的扩展默认不会出现在Store API响应里,因为Shopware的API序列化器默认只包含实体定义中注册并标记为ApiAware的扩展,或手动标记为ApiAware的动态扩展。
快速解决方法:标记动态扩展为ApiAware
在调用addExtension时,传入第三个参数true,直接将该动态扩展标记为API可见:
// 第三个参数设为true,标记扩展为API可返回 $product->addExtension('myExtension', new ArrayStruct(['foo' => 'bar']), true);
修改后,store-api/product-listing接口的响应中就会出现你期望的myExtension字段,格式与示例一致。
可选方案:预先注册实体扩展(推荐长期场景)
如果该扩展是长期业务需求,建议在产品实体定义中预先注册并标记为ApiAware,确保所有场景下API都会返回该字段:
- 创建自定义产品实体定义扩展类:
<?php namespace YourPluginNamespace\Content\Product; use Shopware\Core\Content\Product\ProductDefinition as CoreProductDefinition; use Shopware\Core\Framework\DataAbstractionLayer\Field\JsonField; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\ApiAware; use Shopware\Core\Framework\DataAbstractionLayer\FieldCollection; class ProductDefinition extends CoreProductDefinition { public function extendFields(FieldCollection $collection): void { parent::extendFields($collection); // 注册myExtension字段并标记为ApiAware $collection->add( (new JsonField('my_extension', 'myExtension')) ->addFlags(new ApiAware()) ); } }
- 在插件的
services.xml中注册自定义定义:
<service id="YourPluginNamespace\Content\Product\ProductDefinition" decorates="Shopware\Core\Content\Product\ProductDefinition"> <argument type="service" id="YourPluginNamespace\Content\Product\ProductDefinition.inner"/> <argument type="service" id="Shopware\Core\Framework\DataAbstractionLayer\FieldSerializer\JsonFieldSerializer"/> </service>
- 后续在事件中直接赋值即可:
$product->setMyExtension(['foo' => 'bar']); // 或继续使用addExtension,因已注册,API会自动返回 $product->addExtension('myExtension', new ArrayStruct(['foo' => 'bar']));
关于动态扩展的ApiAware标记
可以为动态扩展设置ApiAware标记,通过addExtension方法的第三个参数$apiAware控制,传入true即可让该扩展被API序列化器包含到响应中。
内容的提问来源于stack exchange,提问作者Benny
相关产品推荐
相关产品推荐

