Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 90a4f69

Browse files
[DI] Reported cascades of autowiring error messages
1 parent 451c32a commit 90a4f69

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class AutowirePass extends AbstractRecursivePass
3030
private $types;
3131
private $ambiguousServiceTypes = array();
3232
private $autowired = array();
33+
private $lastFailure;
3334

3435
/**
3536
* {@inheritdoc}
@@ -77,21 +78,19 @@ protected function processValue($value, $isRoot = false)
7778
{
7879
if ($value instanceof TypedReference) {
7980
if ($ref = $this->getAutowiredReference($value)) {
80-
$value = $ref;
81-
} else {
82-
$this->container->log($this, $this->createTypeNotFoundMessage($value->getType(), 'typed reference'));
81+
return $ref;
8382
}
83+
$this->container->log($this, $this->createTypeNotFoundMessage($value->getType(), 'it'));
8484
}
85-
if (!$value instanceof Definition) {
86-
return parent::processValue($value, $isRoot);
87-
}
88-
if (!$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
89-
return parent::processValue($value, $isRoot);
85+
$value = parent::processValue($value, $isRoot);
86+
87+
if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
88+
return $value;
9089
}
9190
if (!$reflectionClass = $this->container->getReflectionClass($value->getClass())) {
9291
$this->container->log($this, sprintf('Skipping service "%s": Class or interface "%s" does not exist.', $this->currentId, $value->getClass()));
9392

94-
return parent::processValue($value, $isRoot);
93+
return $value;
9594
}
9695

9796
$autowiredMethods = $this->getMethodsToAutowire($reflectionClass);
@@ -115,7 +114,7 @@ protected function processValue($value, $isRoot = false)
115114
$value->setMethodCalls($methodCalls);
116115
}
117116

118-
return parent::processValue($value, $isRoot);
117+
return $value;
119118
}
120119

121120
/**
@@ -246,9 +245,7 @@ private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, a
246245

247246
if ($parameter->isDefaultValueAvailable()) {
248247
$value = $parameter->getDefaultValue();
249-
} elseif ($parameter->allowsNull()) {
250-
$value = null;
251-
} else {
248+
} elseif (!$parameter->allowsNull()) {
252249
throw new RuntimeException($failureMessage);
253250
}
254251
$this->container->log($this, $failureMessage);
@@ -279,6 +276,7 @@ private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, a
279276
*/
280277
private function getAutowiredReference(TypedReference $reference)
281278
{
279+
$this->lastFailure = null;
282280
$type = $reference->getType();
283281

284282
if ($type !== (string) $reference || ($this->container->has($type) && !$this->container->findDefinition($type)->isAbstract())) {
@@ -406,6 +404,7 @@ private function createAutowiredDefinition($type)
406404
$this->container->setDefinition($argumentId, $argumentDefinition);
407405
} catch (RuntimeException $e) {
408406
$this->autowired[$type] = false;
407+
$this->lastFailure = ' - '.$e->getMessage();
409408
$this->container->log($this, $e->getMessage());
410409

411410
return;
@@ -427,7 +426,14 @@ private function createTypeNotFoundMessage($type, $label)
427426
$message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $this->createTypeAlternatives($type));
428427
}
429428

430-
return sprintf('Cannot autowire service "%s": %s %s', $this->currentId, $label, $message);
429+
$message = sprintf('Cannot autowire service "%s": %s %s', $this->currentId, $label, $message);
430+
431+
if (null !== $this->lastFailure) {
432+
$message = $this->lastFailure."\n - ".$message;
433+
$this->lastFailure = null;
434+
}
435+
436+
return $message;
431437
}
432438

433439
private function createTypeAlternatives($type)

0 commit comments

Comments
 (0)