如何考虑对象构造器中的注释组



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在避免时,将一个属性密钥排除在外。客户可能仍会同时发送emailusername。不应考虑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,无论它们是否是实际上下文组的一部分,它们都会被计入。

我创建了对象的替代版本,以解决此不当行为(至少对我来说)。希望它有帮助

最新更新