1<?php 2 3declare(strict_types=1); 4 5namespace JMS\Serializer\Metadata\Driver; 6 7use Doctrine\Common\Persistence\Mapping\ClassMetadata as DoctrineClassMetadata; 8use JMS\Serializer\Metadata\PropertyMetadata; 9 10/** 11 * This class decorates any other driver. If the inner driver does not provide a 12 * a property type, the decorator will guess based on Doctrine 2 metadata. 13 */ 14class DoctrinePHPCRTypeDriver extends AbstractDoctrineTypeDriver 15{ 16 protected function hideProperty(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata): bool 17 { 18 return 'lazyPropertiesDefaults' === $propertyMetadata->name 19 || $doctrineMetadata->parentMapping === $propertyMetadata->name 20 || $doctrineMetadata->node === $propertyMetadata->name; 21 } 22 23 protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata): void 24 { 25 $propertyName = $propertyMetadata->name; 26 if ($doctrineMetadata->hasField($propertyName) 27 && ($typeOfFiled = $doctrineMetadata->getTypeOfField($propertyName)) 28 && ($fieldType = $this->normalizeFieldType($typeOfFiled))) { 29 $field = $doctrineMetadata->getFieldMapping($propertyName); 30 if (!empty($field['multivalue'])) { 31 $fieldType = 'array'; 32 } 33 34 $propertyMetadata->setType($this->typeParser->parse($fieldType)); 35 } elseif ($doctrineMetadata->hasAssociation($propertyName)) { 36 try { 37 $targetEntity = $doctrineMetadata->getAssociationTargetClass($propertyName); 38 } catch (\Throwable $e) { 39 return; 40 } 41 42 if (null === $this->tryLoadingDoctrineMetadata($targetEntity)) { 43 return; 44 } 45 46 if (!$doctrineMetadata->isSingleValuedAssociation($propertyName)) { 47 $targetEntity = sprintf('ArrayCollection<%s>', $targetEntity); 48 } 49 50 $propertyMetadata->setType($this->typeParser->parse($targetEntity)); 51 } 52 } 53} 54