jmsserializer带有一个学说对象构造函数,可以完成其作业,但想象一个具有两个属性的实体形成一个主键:
UserBase
prop annotated with @ORMId and @SerializerGroups({"1"})
- username
prop annotated with @ORMId and @SerializerGroups({"2"})
- email
User extends UserBase
- other props here, no Id defined.
通过使用group=1
在避免时,将一个属性密钥排除在外。客户可能仍会同时发送email
和username
。不应考虑email
。
不幸的是,如果您通过人体中的两个属性,则DoctrineObjectConstructor
不会检查是否被避难所排除在外,因此它试图根据两个值从DB加载实体:
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
,好像我没有通过该属性
...不那么快!我的实体User
扩展了我所有标识符所在的UserBase
,因此我应该以通用方式考虑层次结构。
任何提示?
好的,JMSSerializer的对象构造函数在确定标识符时不考虑序列化组。因此,如果您在对象中包含所有ID,无论它们是否是实际上下文组的一部分,它们都会被计入。
我创建了对象的替代版本,以解决此不当行为(至少对我来说)。希望它有帮助