[DI] Reporte cascades of autowiring error messages
This commit is contained in:
parent
451c32a965
commit
6c0f5e3a6f
@ -30,6 +30,7 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
private $types;
|
private $types;
|
||||||
private $ambiguousServiceTypes = array();
|
private $ambiguousServiceTypes = array();
|
||||||
private $autowired = array();
|
private $autowired = array();
|
||||||
|
private $lastFailure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
@ -77,21 +78,19 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
{
|
{
|
||||||
if ($value instanceof TypedReference) {
|
if ($value instanceof TypedReference) {
|
||||||
if ($ref = $this->getAutowiredReference($value)) {
|
if ($ref = $this->getAutowiredReference($value)) {
|
||||||
$value = $ref;
|
return $ref;
|
||||||
} else {
|
|
||||||
$this->container->log($this, $this->createTypeNotFoundMessage($value->getType(), 'typed reference'));
|
|
||||||
}
|
}
|
||||||
|
$this->container->log($this, $this->createTypeNotFoundMessage($value->getType(), 'it'));
|
||||||
}
|
}
|
||||||
if (!$value instanceof Definition) {
|
$value = parent::processValue($value, $isRoot);
|
||||||
return parent::processValue($value, $isRoot);
|
|
||||||
}
|
if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
|
||||||
if (!$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
|
return $value;
|
||||||
return parent::processValue($value, $isRoot);
|
|
||||||
}
|
}
|
||||||
if (!$reflectionClass = $this->container->getReflectionClass($value->getClass())) {
|
if (!$reflectionClass = $this->container->getReflectionClass($value->getClass())) {
|
||||||
$this->container->log($this, sprintf('Skipping service "%s": Class or interface "%s" does not exist.', $this->currentId, $value->getClass()));
|
$this->container->log($this, sprintf('Skipping service "%s": Class or interface "%s" does not exist.', $this->currentId, $value->getClass()));
|
||||||
|
|
||||||
return parent::processValue($value, $isRoot);
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
$autowiredMethods = $this->getMethodsToAutowire($reflectionClass);
|
$autowiredMethods = $this->getMethodsToAutowire($reflectionClass);
|
||||||
@ -115,7 +114,7 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
$value->setMethodCalls($methodCalls);
|
$value->setMethodCalls($methodCalls);
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::processValue($value, $isRoot);
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -246,9 +245,7 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
|
|
||||||
if ($parameter->isDefaultValueAvailable()) {
|
if ($parameter->isDefaultValueAvailable()) {
|
||||||
$value = $parameter->getDefaultValue();
|
$value = $parameter->getDefaultValue();
|
||||||
} elseif ($parameter->allowsNull()) {
|
} elseif (!$parameter->allowsNull()) {
|
||||||
$value = null;
|
|
||||||
} else {
|
|
||||||
throw new RuntimeException($failureMessage);
|
throw new RuntimeException($failureMessage);
|
||||||
}
|
}
|
||||||
$this->container->log($this, $failureMessage);
|
$this->container->log($this, $failureMessage);
|
||||||
@ -279,6 +276,7 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
*/
|
*/
|
||||||
private function getAutowiredReference(TypedReference $reference)
|
private function getAutowiredReference(TypedReference $reference)
|
||||||
{
|
{
|
||||||
|
$this->lastFailure = null;
|
||||||
$type = $reference->getType();
|
$type = $reference->getType();
|
||||||
|
|
||||||
if ($type !== (string) $reference || ($this->container->has($type) && !$this->container->findDefinition($type)->isAbstract())) {
|
if ($type !== (string) $reference || ($this->container->has($type) && !$this->container->findDefinition($type)->isAbstract())) {
|
||||||
@ -396,7 +394,8 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
}
|
}
|
||||||
|
|
||||||
$currentId = $this->currentId;
|
$currentId = $this->currentId;
|
||||||
$this->currentId = $this->autowired[$type] = $argumentId = sprintf('autowired.%s', $type);
|
$this->currentId = $type;
|
||||||
|
$this->autowired[$type] = $argumentId = sprintf('autowired.%s', $type);
|
||||||
$argumentDefinition = new Definition($type);
|
$argumentDefinition = new Definition($type);
|
||||||
$argumentDefinition->setPublic(false);
|
$argumentDefinition->setPublic(false);
|
||||||
$argumentDefinition->setAutowired(true);
|
$argumentDefinition->setAutowired(true);
|
||||||
@ -406,7 +405,8 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
$this->container->setDefinition($argumentId, $argumentDefinition);
|
$this->container->setDefinition($argumentId, $argumentDefinition);
|
||||||
} catch (RuntimeException $e) {
|
} catch (RuntimeException $e) {
|
||||||
$this->autowired[$type] = false;
|
$this->autowired[$type] = false;
|
||||||
$this->container->log($this, $e->getMessage());
|
$this->lastFailure = $e->getMessage();
|
||||||
|
$this->container->log($this, $this->lastFailure);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} finally {
|
} finally {
|
||||||
@ -427,7 +427,14 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
$message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $this->createTypeAlternatives($type));
|
$message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $this->createTypeAlternatives($type));
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprintf('Cannot autowire service "%s": %s %s', $this->currentId, $label, $message);
|
$message = sprintf('Cannot autowire service "%s": %s %s', $this->currentId, $label, $message);
|
||||||
|
|
||||||
|
if (null !== $this->lastFailure) {
|
||||||
|
$message = $this->lastFailure."\n".$message;
|
||||||
|
$this->lastFailure = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $message;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createTypeAlternatives($type)
|
private function createTypeAlternatives($type)
|
||||||
|
Reference in New Issue
Block a user