Completed
Push — master ( f78604...98e267 )
by Pavel
04:30
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 4.25

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 24
ccs 9
cts 12
cp 0.75
rs 8.6845
cc 4
eloc 10
nc 4
nop 1
crap 4.25
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 4
    public function loadMetadataForClass(\ReflectionClass $class)
14
    {
15
        /** @var $classMetadata ClassMetadata */
16 4
        $classMetadata = $this->delegate->loadMetadataForClass($class);
17
18
        // Abort if the given class is not a mapped entity
19 4
        if ( ! $doctrineMetadata = $this->tryLoadingDoctrineMetadata($class->name)) {
20
            return $classMetadata;
21
        }
22
23 4
        $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 4
        foreach ($classMetadata->propertyMetadata as $key => $propertyMetadata) {
28 4
            if ($this->hideProperty($doctrineMetadata, $propertyMetadata)) {
29
                unset($classMetadata->propertyMetadata[$key]);
30
            }
31
32 4
            $this->setPropertyType($doctrineMetadata, $propertyMetadata);
33 4
        }
34
35 4
        return $classMetadata;
36
    }
37
38 4
    protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata)
39
    {
40 4
        parent::setPropertyType($doctrineMetadata, $propertyMetadata);
41
42 4
        if (!$doctrineMetadata->hasAssociation($propertyMetadata->name)) {
43 4
            return;
44
        }
45
46 4
        $template = '%s<%s>';
47
48
        // Makes the My\Ns\TargetEntity be DoctrineAssociation<My\Ns\TargetEntity>
49
        // And ArrayCollection<My\Ns\TargetEntity> be DoctrineAssociation<ArrayCollection<My\Ns\TargetEntity>>
50 4
        $propertyMetadata->setType(
51 4
            sprintf(
52 4
                $template,
53 4
                JmsDoctrineHandler::TYPE,
54 4
                $propertyMetadata->type['name']
55 4
            )
56 4
        );
57 4
    }
58
}
59