JMSSerializer поставляется с застройщиком объекта доктрины, которая делает свою работу, но представьте себе объект с двумя свойств формирования первичного ключа:как рассматривать аннотации группы в ObjectConstructor
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
, как если бы я не прошел эту собственность в организме
... не так быстро! My Entity User
расширяет UserBase
, где весь мой идентификатор, поэтому я должен учитывать иерархию, возможно, в общем виде.
Подсказка?