-
-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathServiceMap.php
More file actions
119 lines (100 loc) · 4.16 KB
/
Copy pathServiceMap.php
File metadata and controls
119 lines (100 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php declare(strict_types=1);
namespace mglaman\PHPStanDrupal\Drupal;
use function class_exists;
class ServiceMap
{
/** @var DrupalServiceDefinition[] */
private static $services = [];
public function getService(string $id): ?DrupalServiceDefinition
{
return self::$services[$id] ?? null;
}
/**
* @return DrupalServiceDefinition[]
*/
public function getServices(): array
{
return self::$services;
}
public function setDrupalServices(array $drupalServices): void
{
self::$services = [];
$decorators = [];
foreach ($drupalServices as $serviceId => $serviceDefinition) {
// @todo this duplicates \Symfony\Component\DependencyInjection\Loader\YamlFileLoader::parseDefinition()
// Can we re-use the YamlFileLoader instead of this manual parsing?
if (is_string($serviceDefinition) && strpos($serviceDefinition, '@') === 0) {
$serviceDefinition = [
'alias' => substr($serviceDefinition, 1)
];
}
if (is_null($serviceDefinition)) {
$serviceDefinition = [];
}
if (!is_array($serviceDefinition)) {
continue;
}
if (isset($serviceDefinition['alias'], $drupalServices[$serviceDefinition['alias']])) {
$serviceDefinition = $drupalServices[$serviceDefinition['alias']];
}
if (isset($serviceDefinition['parent'], $drupalServices[$serviceDefinition['parent']])) {
$serviceDefinition = $this->resolveParentDefinition($serviceDefinition['parent'], $serviceDefinition, $drupalServices);
}
if (isset($serviceDefinition['decorates'])) {
$decorators[$serviceDefinition['decorates']][] = $serviceId;
}
// @todo support factories
if (isset($serviceDefinition['factory'])) {
continue;
}
if (!isset($serviceDefinition['class'])) {
if (class_exists($serviceId)) {
$serviceDefinition['class'] = $serviceId;
} else {
continue;
}
}
self::$services[$serviceId] = new DrupalServiceDefinition(
(string) $serviceId,
$serviceDefinition['class'],
$serviceDefinition['public'] ?? true,
$serviceDefinition['alias'] ?? null
);
$deprecated = $serviceDefinition['deprecated'] ?? null;
if ($deprecated) {
self::$services[$serviceId]->setDeprecated(true, $deprecated);
}
}
foreach ($decorators as $decorated_service_id => $services) {
if (!isset(self::$services[$decorated_service_id])) {
continue;
}
foreach ($services as $decorating_service_id) {
if (!isset(self::$services[$decorating_service_id])) {
continue;
}
self::$services[$decorated_service_id]->addDecorator(self::$services[$decorating_service_id]);
}
}
}
private function resolveParentDefinition(string $parentId, array $serviceDefinition, array $drupalServices): array
{
$parentDefinition = $drupalServices[$parentId] ?? [];
if ([] === $parentDefinition) {
return $parentDefinition;
}
if (isset($parentDefinition['parent'])) {
if (!isset($drupalServices[$parentDefinition['parent']])) {
return $serviceDefinition;
}
$parentDefinition = $this->resolveParentDefinition($parentDefinition['parent'], $drupalServices[$parentDefinition['parent']], $drupalServices);
}
if (isset($parentDefinition['class']) && !isset($serviceDefinition['class'])) {
$serviceDefinition['class'] = $parentDefinition['class'];
}
if (isset($parentDefinition['public']) && !isset($serviceDefinition['public'])) {
$serviceDefinition['public'] = $parentDefinition['public'];
}
return $serviceDefinition;
}
}