Skip to content

Commit e7fa17c

Browse files
committed
Resolver::normalizeReference() normalizes current service to 'self', added getDefinition() & resolveReferenceType()
1 parent ca46492 commit e7fa17c

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

src/DI/Resolver.php

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,24 @@ public function resolveDefinition(Definition $def): void
7070

7171
public function resolveServiceType(string $name): ?string
7272
{
73-
$def = $this->builder->getDefinition($name);
73+
$def = $this->getDefinition($name);
7474
if (!$def->getType()) {
7575
$this->resolveDefinition($def);
7676
}
7777
return $def->getType();
7878
}
7979

8080

81+
private function resolveReferenceType(Reference $reference): ?string
82+
{
83+
return $reference->isName()
84+
? $this->resolveServiceType($reference->getValue())
85+
: $reference->getValue();
86+
}
87+
88+
8189
public function resolveEntityType($entity): ?string
8290
{
83-
$definitions = $this->builder->getDefinitions();
8491
$entity = $this->normalizeEntity($entity instanceof Statement ? $entity->getEntity() : $entity);
8592

8693
if (is_array($entity)) {
@@ -111,11 +118,7 @@ public function resolveEntityType($entity): ?string
111118
return $type;
112119

113120
} 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);
121+
return $this->resolveReferenceType($entity);
119122

120123
} elseif (is_string($entity)) { // class
121124
if (!class_exists($entity)) {
@@ -151,7 +154,6 @@ public function completeStatement(Statement $statement, Definition $currentServi
151154

152155
$entity = $this->normalizeEntity($statement->getEntity());
153156
$arguments = $this->convertReferences($statement->arguments);
154-
$definitions = $this->builder->getDefinitions();
155157

156158
switch (true) {
157159
case is_string($entity) && Strings::contains($entity, '?'): // PHP literal
@@ -177,7 +179,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
177179

178180
case $entity instanceof Reference:
179181
$params = [];
180-
foreach ($definitions[$entity->getName()]->parameters as $k => $v) {
182+
foreach ($this->getDefinition($entity->getName())->parameters as $k => $v) {
181183
$params[] = preg_replace('#\w+\z#', '\$$0', (is_int($k) ? $v : $k)) . (is_int($k) ? '' : ' = ' . PhpHelpers::dump($v));
182184
}
183185
$rm = new \ReflectionFunction(eval('return function(' . implode(', ', $params) . ') {};'));
@@ -214,7 +216,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
214216
} elseif (
215217
$type = !$entity[0] instanceof Reference || $entity[1] === 'create'
216218
? $this->resolveEntityType($entity[0])
217-
: $definitions[$entity[0]->getName()]->getType()
219+
: $this->resolveServiceType($entity[0]->getName())
218220
) {
219221
$rc = new ReflectionClass($type);
220222
if ($rc->hasMethod($entity[1])) {
@@ -307,13 +309,16 @@ private function normalizeEntity($entity)
307309

308310

309311
/**
310-
* Tries to convert Reference to named and checks service existence.
312+
* Tries to convert Reference to named (or 'self') and checks service existence.
311313
*/
312314
public function normalizeReference(Reference $ref): Reference
313315
{
314316
$service = $ref->getValue();
315317
if ($service === Reference::SELF) {
316-
$service = $this->currentService->getName();
318+
if (in_array($this->currentService, $this->builder->getDefinitions(), true)) {
319+
return new Reference($this->currentService->getName());
320+
}
321+
return new Reference(Reference::SELF);
317322

318323
} elseif (Strings::contains($service, '\\')) {
319324
try {
@@ -333,6 +338,14 @@ public function normalizeReference(Reference $ref): Reference
333338
}
334339

335340

341+
private function getDefinition($name): Definition
342+
{
343+
return $name === Reference::SELF
344+
? $this->currentService
345+
: $this->builder->getDefinition($name);
346+
}
347+
348+
336349
/**
337350
* Resolves service name by type.
338351
*/
@@ -396,8 +409,8 @@ private function convertReferences(array $arguments): array
396409
if (!isset($pair[1])) { // @service
397410
$val = new Reference($pair[0]);
398411
} elseif (preg_match('#^[A-Z][A-Z0-9_]*\z#', $pair[1], $m)) { // @service::CONSTANT
399-
$ref = $this->normalizeReference(new Reference($pair[0]));
400-
$val = ContainerBuilder::literal($this->builder->getDefinition($ref->getName())->getType() . '::' . $pair[1]);
412+
$type = $this->resolveReferenceType(new Reference($pair[0]));
413+
$val = ContainerBuilder::literal($type . '::' . $pair[1]);
401414
} else { // @service::property
402415
$val = new Statement([new Reference($pair[0]), '$' . $pair[1]]);
403416
}

0 commit comments

Comments
 (0)