Completed
Pull Request — master (#17)
by Pavel
10:40
created

JmsDoctrineMetadataDriver::loadMetadataForClass()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 24
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5.024

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 9
cts 15
cp 0.6
rs 8.6845
c 0
b 0
f 0
cc 4
eloc 10
nc 4
nop 1
crap 5.024
1
<?php
2
3
namespace ScayTrase\Api\Cruds\Adaptors\JmsSerializer;
4
5
use Doctrine\Common\Persistence\Mapping\ClassMetadata as DoctrineClassMetadata;
6
use JMS\Serializer\Metadata\ClassMetadata;
7
use JMS\Serializer\Metadata\Driver\AbstractDoctrineTypeDriver;
8
use JMS\Serializer\Metadata\PropertyMetadata;
9
10
final class JmsDoctrineMetadataDriver extends AbstractDoctrineTypeDriver
11
{
12
    /** {@inheritdoc} */
13 10
    public function loadMetadataForClass(\ReflectionClass $class)
14
    {
15
        /** @var $classMetadata ClassMetadata */
16 10
        $classMetadata = $this->delegate->loadMetadataForClass($class);
17
18
        // Abort if the given class is not a mapped entity
19 10
        if (!$doctrineMetadata = $this->tryLoadingDoctrineMetadata($class->name)) {
20
            return $classMetadata;
21
        }
22
23 10
        $this->setDiscriminator($doctrineMetadata, $classMetadata);
24
25
        // We base our scan on the internal driver's property list so that we
26
        // respect any internal white/blacklisting like in the AnnotationDriver
27 10
        foreach ($classMetadata->propertyMetadata as $key => $propertyMetadata) {
28 10
            if ($this->hideProperty($doctrineMetadata, $propertyMetadata)) {
29
                unset($classMetadata->propertyMetadata[$key]);
30
            }
31
32 10
            $this->setPropertyType($doctrineMetadata, $propertyMetadata);
33 10
        }
34
35 10
        return $classMetadata;
36
    }
37
38 10
    protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata)
39
    {
40 10
        parent::setPropertyType($doctrineMetadata, $propertyMetadata);
41
42 10
        if (!$doctrineMetadata->hasAssociation($propertyMetadata->name)) {
43 10
            return;
44
        }
45
46 10
        $template = '%s<%s>';
47
48 10
        if (null === $propertyMetadata->type['name']) {
49
            $propertyMetadata->type['name'] = $doctrineMetadata->getAssociationTargetClass($propertyMetadata->name);
50
        }
51
52
        // Makes the My\Ns\TargetEntity be DoctrineAssociation<My\Ns\TargetEntity>
53
        // And ArrayCollection<My\Ns\TargetEntity> be DoctrineAssociation<ArrayCollection<My\Ns\TargetEntity>>
54 10
        $propertyMetadata->setType(
55 10
            sprintf(
56 10
                $template,
57 10
                JmsDoctrineHandler::TYPE,
58 10
                $propertyMetadata->type['name']
59 10
            )
60 10
        );
61 10
    }
62
}
63