MetadataListener   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 95.24%

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 5
dl 0
loc 59
ccs 20
cts 21
cp 0.9524
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getSubscribedEvents() 0 4 1
B loadClassMetadata() 0 28 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Facile\DoctrineDDM;
6
7
use Doctrine\Common\Annotations\AnnotationReader;
8
use Doctrine\Common\EventSubscriber;
9
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
10
use Doctrine\ORM\Mapping\ClassMetadata;
11
use Doctrine\ORM\Mapping\DiscriminatorMap;
12
use Facile\DoctrineDDM\Configuration\Metadata as Configuration;
13
14
/**
15
 * Class MetadataListener.
16
 */
17
class MetadataListener implements EventSubscriber
18
{
19
    /**
20
     * @var Configuration
21
     */
22
    protected $metadataConfig;
23
24
    /**
25
     * MetadataListener constructor.
26
     *
27
     * @param Configuration $metadataConfig
28
     */
29 3
    public function __construct(Configuration $metadataConfig)
30
    {
31 3
        $this->metadataConfig = $metadataConfig;
32 3
    }
33
34
    /**
35
     * Returns an array of events this subscriber wants to listen to.
36
     *
37
     * @return array
38
     */
39 2
    public function getSubscribedEvents()
40
    {
41 2
        return ['loadClassMetadata'];
42
    }
43
44
    /**
45
     * @param LoadClassMetadataEventArgs $event
46
     */
47 1
    public function loadClassMetadata(LoadClassMetadataEventArgs $event)
48
    {
49
        /** @var ClassMetadata $metadata */
50 1
        $metadata = $event->getClassMetadata();
51
52 1
        $entityMetadata = $this->metadataConfig->getEntityMetadata($metadata->getName());
53
54 1
        if (! $entityMetadata) {
55 1
            return;
56
        }
57
58 1
        $class = $metadata->getReflectionClass();
59 1
        if ($class === null) {
60
            $class = new \ReflectionClass($metadata->getName());
61
        }
62
63 1
        $reader = new AnnotationReader();
64
65 1
        $discriminatorMap = [];
66 1
        $discriminatorMapAnnotation = $reader->getClassAnnotation($class, DiscriminatorMap::class);
67
68 1
        if (null !== $discriminatorMapAnnotation) {
69 1
            $discriminatorMap = $discriminatorMapAnnotation->value;
70
        }
71
72 1
        $discriminatorMap = array_merge($discriminatorMap, $entityMetadata->getDiscriminatorMap());
73 1
        $metadata->setDiscriminatorMap($discriminatorMap);
74 1
    }
75
}
76