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
。客户端可能仍会同时发送email
和username
。email
不过不应该考虑。
不幸的是,如果您在正文中传递两个属性,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
我所有标识符所在的位置,因此我应该考虑层次结构,可能以通用方式。
有什么提示吗?