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