Skip to content

Commit 286f0d8

Browse files
committed
Resolver::normalizeReference() normalizes current service to 'self', added getDefinition() & resolveReferenceType()
1 parent 184dc38 commit 286f0d8

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

src/DI/Resolver.php

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,34 @@ public function resolveDefinition(Definition $def): void
6868
}
6969

7070

71+
private function getDefinition($name): Definition
72+
{
73+
return $name === ContainerBuilder::THIS_SERVICE
74+
? $this->currentService
75+
: $this->builder->getDefinition($name);
76+
}
77+
78+
7179
public function resolveServiceType(string $name): ?string
7280
{
73-
$def = $this->builder->getDefinition($name);
81+
$def = $this->getDefinition($name);
7482
if (!$def->getType()) {
7583
$this->resolveDefinition($def);
7684
}
7785
return $def->getType();
7886
}
7987

8088

89+
private function resolveReferenceType(Reference $reference): ?string
90+
{
91+
return $reference->isName()
92+
? $this->resolveServiceType($reference->getValue())
93+
: $reference->getValue();
94+
}
95+
96+
8197
public function resolveEntityType($entity): ?string
8298
{
83-
$definitions = $this->builder->getDefinitions();
8499
$entity = $this->normalizeEntity($entity instanceof Statement ? $entity->getEntity() : $entity);
85100

86101
if (is_array($entity)) {
@@ -111,11 +126,7 @@ public function resolveEntityType($entity): ?string
111126
return $type;
112127

113128
} elseif ($entity instanceof Reference) { // alias or factory
114-
if (!$entity->isName()) { // @\Class
115-
return $entity->getValue();
116-
}
117-
$service = $entity->getName();
118-
return $definitions[$service]->getImplement() ?: $this->resolveServiceType($service);
129+
return $this->resolveReferenceType($entity);
119130

120131
} elseif (is_string($entity)) { // class
121132
if (!class_exists($entity)) {
@@ -151,7 +162,6 @@ public function completeStatement(Statement $statement, Definition $currentServi
151162

152163
$entity = $this->normalizeEntity($statement->getEntity());
153164
$arguments = $this->convertReferences($statement->arguments);
154-
$definitions = $this->builder->getDefinitions();
155165

156166
switch (true) {
157167
case is_string($entity) && Strings::contains($entity, '?'): // PHP literal
@@ -177,7 +187,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
177187

178188
case $entity instanceof Reference:
179189
$params = [];
180-
foreach ($definitions[$entity->getName()]->parameters as $k => $v) {
190+
foreach ($this->getDefinition($entity->getName())->parameters as $k => $v) {
181191
$params[] = preg_replace('#\w+\z#', '\$$0', (is_int($k) ? $v : $k)) . (is_int($k) ? '' : ' = ' . PhpHelpers::dump($v));
182192
}
183193
$rm = new \ReflectionFunction(eval('return function(' . implode(', ', $params) . ') {};'));
@@ -214,7 +224,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
214224
} elseif (
215225
$type = !$entity[0] instanceof Reference || $entity[1] === 'create'
216226
? $this->resolveEntityType($entity[0])
217-
: $definitions[$entity[0]->getName()]->getType()
227+
: $this->resolveServiceType($entity[0]->getName())
218228
) {
219229
$rc = new ReflectionClass($type);
220230
if ($rc->hasMethod($entity[1])) {
@@ -319,7 +329,10 @@ public function normalizeReference($arg): ?Reference
319329
return null;
320330
}
321331
if ($service === ContainerBuilder::THIS_SERVICE) {
322-
$service = $this->currentService->getName();
332+
if (current(array_keys($this->builder->getDefinitions(), $this->currentService, true))) {
333+
return new Reference($this->currentService->getName());
334+
}
335+
return new Reference(ContainerBuilder::THIS_SERVICE);
323336
}
324337
if (Strings::contains($service, '\\')) {
325338
try {
@@ -402,8 +415,8 @@ private function convertReferences(array $arguments): array
402415
if (!isset($pair[1])) { // @service
403416
$val = new Reference($pair[0]);
404417
} elseif (preg_match('#^[A-Z][A-Z0-9_]*\z#', $pair[1], $m)) { // @service::CONSTANT
405-
$ref = $this->normalizeReference(new Reference($pair[0]));
406-
$val = ContainerBuilder::literal($this->builder->getDefinition($ref->getName())->getType() . '::' . $pair[1]);
418+
$type = $this->resolveReferenceType(new Reference($pair[0]));
419+
$val = ContainerBuilder::literal($type . '::' . $pair[1]);
407420
} else { // @service::property
408421
$val = new Statement([new Reference($pair[0]), '$' . $pair[1]]);
409422
}

0 commit comments

Comments
 (0)