0

JMSSerializer 带有一个 Doctrine 对象构造器来完成它的工作,但是想象一个具有两个属性的实体形成一个主键:

UserBase
    prop annotated with @ORM\Id and @Serializer\Groups({"1"})
  - username
    prop annotated with @ORM\Id and @Serializer\Groups({"2"})
  - email

User extends UserBase
  - other props here, no Id defined.

反序列化时使用排除一个属性键group=1。客户端可能仍会同时发送emailusernameemail不过不应该考虑。

不幸的是,如果您在正文中传递两个属性,DoctrineObjectConstructor则不会检查反序列化是否排除了某些内容,因此它会尝试根据两个值从数据库中加载实体:

    foreach ($classMetadata->getIdentifierFieldNames() as $name) {
        if ( ! array_key_exists($name, $data)) {
            return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context);
        }

        $identifierList[$name] = $data[$name];
    }

我想做的是考虑到我的注释组,以便fallbackConstructor在缺少形成标识符的某些属性的情况下使用。

作为初学者,这是一个很好的观点:我创​​建了自己的服务,通过传递annotationDriver. 然后,如果形成标识符的属性与实际组无关:

$classMetadata = $this->annotationDriver->loadMetadataForClass($metadata->reflection);
$classMetadata->properties //here groups are listed for each property

我可以回退到fallbackConstructor,就好像我没有通过 body 中的那个属性一样

……没那么快!我的实体User扩展了UserBase我所有标识符所在的位置,因此我应该考虑层次结构,可能以通用方式。

有什么提示吗?

4

1 回答 1

0

好吧,JMSSerializer 的对象构造函数在确定标识符时不考虑序列化组。因此,如果您在对象中包含所有 ID,无论它们是否属于实际上下文组,它们都将被计入。

我创建了Object 的替代版本以修复这种不当行为(至少对我而言)。希望能帮助到你

于 2016-12-02T17:25:36.947 回答