MetadataWrapperProvider   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 91
rs 10
c 0
b 0
f 0
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getClassMetadataWrapperByClassName() 0 17 4
B getClassMetadataWrapperByObjects() 0 38 4
1
<?php
2
3
namespace Xsolve\Associate\Metadata;
4
5
use Doctrine\ORM\EntityManagerInterface;
6
use Doctrine\ORM\EntityRepository;
7
use Doctrine\ORM\Mapping\ClassMetadata;
8
9
class MetadataWrapperProvider
10
{
11
    /**
12
     * @var EntityManagerInterface
13
     */
14
    protected $entityManager;
15
16
    /**
17
     * @var (ClassMetadataWrapper|null)[]
18
     */
19
    protected $classMetadataWrappers = [];
20
21
    /**
22
     * @param EntityManagerInterface $entityManager
23
     */
24
    public function __construct(EntityManagerInterface $entityManager)
25
    {
26
        $this->entityManager = $entityManager;
27
    }
28
29
    /**
30
     * @param array $objects
31
     *
32
     * @return ClassMetadataWrapper|null
33
     */
34
    public function getClassMetadataWrapperByObjects(array $objects)
35
    {
36
        $classNames = array_unique(array_map(
37
            function ($object) { return get_class($object); },
38
            $objects
39
        ));
40
41
        $classMetadataWrappers = array_map(
42
            function (string $className) { return $this->getClassMetadataWrapperByClassName($className); },
43
            $classNames
44
        );
45
46
        // If metadata were not available for some objects.
47
        if (in_array(null, $classMetadataWrappers, true)) {
48
            return null;
49
        }
50
51
        $classNames = array_unique(array_map(
52
            function (ClassMetadataWrapper $classMetadataWrapper) {
53
                return $classMetadataWrapper->getClassName();
54
            },
55
            $classMetadataWrappers
56
        ));
57
58
        if (1 === count($classNames)) {
59
            return reset($classMetadataWrappers);
60
        }
61
62
        $rootClassNames = array_unique(array_map(
63
            function (ClassMetadataWrapper $classMetadataWrapper) {
64
                return $classMetadataWrapper->getRootClassName();
65
            },
66
            $classMetadataWrappers
67
        ));
68
69
        if (1 === count($rootClassNames)) {
70
            return $this->getClassMetadataWrapperByClassName(
71
                reset($rootClassNames)
72
            );
73
        }
74
    }
75
76
    /**
77
     * @param string $className
78
     *
79
     * @return ClassMetadataWrapper|null
80
     *
81
     * @throws \Exception
82
     */
83
    public function getClassMetadataWrapperByClassName(string $className)
84
    {
85
        if (!array_key_exists($className, $this->classMetadataWrappers)) {
86
            $classMetadata = $this->entityManager->getClassMetadata($className);
87
88
            if ($classMetadata instanceof ClassMetadata) {
89
                $entityRepository = $this->entityManager->getRepository($className);
90
                if (!$entityRepository instanceof EntityRepository) {
91
                    throw new \Exception();
92
                }
93
                $this->classMetadataWrappers[$className] = new ClassMetadataWrapper($this, $entityRepository, $classMetadata);
94
            } else {
95
                $this->classMetadataWrappers[$className] = null;
96
            }
97
        }
98
99
        return $this->classMetadataWrappers[$className];
100
    }
101
}
102