API平台,混合了mongoDB中的@EmbedOne() 安装程序

API平台,混合了mongoDB中的@EmbedOne() 安装程序,mongodb,symfony,api-platform.com,doctrine-odm,Mongodb,Symfony,Api Platform.com,Doctrine Odm,我在API平台中使用mongoDB,并创建了以下属性文档: /** * @ApiResource * @ODM\Document */ class Attribute { /** * @ODM\EmbedOne( * discriminatorField="type", * discriminatorMap={ * "string"=ValueString::class, *

我在API平台中使用mongoDB,并创建了以下属性文档:

/**
 * @ApiResource
 * @ODM\Document
 */
class Attribute
{
    /**
     * @ODM\EmbedOne(
     *   discriminatorField="type",
     *   discriminatorMap={
     *     "string"=ValueString::class,
     *     "number"=ValueNumber::class
     *   },
     *   defaultDiscriminatorValue="string"
     * )
     */
    public $value;
}
属性文档可以嵌入以下嵌入文档之一:

/** @ODM\EmbeddedDocument */
class ValueString
{
    /**
     * @ODM\Field
     */
    public $value;
}

我的目标是能够为属性值属性指定不同的值格式和数据类型。这是我使用mongoDB的原因之一

问题 但是,当我尝试通过POST请求创建属性时,我得到以下错误:

{
  "@context": "\/contexts\/Error",
  "@type": "hydra:Error",
  "hydra:title": "An error occurred",
  "hydra:description": "Argument 2 passed to Symfony\\Component\\Serializer\\Serializer::supportsDenormalization() must be of the type string, null given, called in \/srv\/api\/vendor\/symfony\/serializer\/Normalizer\/AbstractObjectNormalizer.php on line 434",
  "trace": [
...
}
可能的解决办法 调试后,我发现问题是由于未在
doctor\ODM\MongoDB\Mapping\ClassMetadata
中设置
targetDocument
属性引起的。我试图通过监听Doctrine ODM
loadClassMetadata
事件并手动设置
targetDocument
(可能基于某些指定的请求属性,如“type”)来解决这个问题

但是,此解决方案的问题是,
$value
属性的
targetDocument
只设置了一次。因为此属性可以接受多个嵌入文档,因此多个
targetDocuments
这不是一个可行的解决方案

我的问题 在使用mongoDB的API平台中,在单个属性中拥有不同的嵌入式文档的最佳方式是什么?API平台是否正确支持这个@EmbedOne?我是否正确配置了它?多谢各位

{
  "@context": "\/contexts\/Error",
  "@type": "hydra:Error",
  "hydra:title": "An error occurred",
  "hydra:description": "Argument 2 passed to Symfony\\Component\\Serializer\\Serializer::supportsDenormalization() must be of the type string, null given, called in \/srv\/api\/vendor\/symfony\/serializer\/Normalizer\/AbstractObjectNormalizer.php on line 434",
  "trace": [
...
}