2016-12-02 16 views
0

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, где весь мой идентификатор, поэтому я должен учитывать иерархию, возможно, в общем виде.

Подсказка?

ответ

0

Хорошо, JMSSerializer Object Constructor не рассматривает группы сериализации при определении идентификаторов. Следовательно, если вы включите все идентификаторы в свой объект, независимо от того, являются ли они частью фактической контекстной группы или нет, они будут учтены.

Я создал объект объекта, чтобы исправить это неправильное поведение (по крайней мере, для меня). Надеюсь, это поможет