[DI] Save a ReflectionClass instanciation in AutowirePass

This commit is contained in:
Nicolas Grekas 2017-02-01 13:10:11 +01:00
parent b3b3dac81b
commit b893c72070

View File

@ -219,8 +219,15 @@ class AutowirePass extends AbstractRecursivePass
continue;
}
try {
if (!$typeHint = $parameter->getClass()) {
if (method_exists($parameter, 'getType')) {
if ($typeName = $parameter->getType()) {
$typeName = $typeName->isBuiltin() ? null : ($typeName instanceof \ReflectionNamedType ? $typeName->getName() : $typeName->__toString());
}
} elseif (preg_match('/^(?:[^ ]++ ){4}([a-zA-Z_\x7F-\xFF][^ ]++)/', $parameter, $typeName)) {
$typeName = 'callable' === $typeName[1] || 'array' === $typeName[1] ? null : $typeName[1];
}
if (!$typeName) {
// no default value? Then fail
if (!$parameter->isOptional()) {
if ($mustAutowire) {
@ -242,10 +249,21 @@ class AutowirePass extends AbstractRecursivePass
$this->populateAvailableTypes();
}
if (isset($this->types[$typeHint->name])) {
$value = new Reference($this->types[$typeHint->name]);
if (isset($this->types[$typeName])) {
$arguments[$index] = new Reference($this->types[$typeName]);
$didAutowire = true;
} else {
continue;
}
try {
$typeHint = new \ReflectionClass($typeName);
} catch (\ReflectionException $e) {
// Typehint against a non-existing class
$typeHint = false;
}
if ($typeHint) {
try {
$value = $this->createAutowiredDefinition($typeHint);
$didAutowire = true;
@ -263,10 +281,7 @@ class AutowirePass extends AbstractRecursivePass
return array();
}
}
}
} catch (\ReflectionException $e) {
// Typehint against a non-existing class
} else {
if (!$parameter->isDefaultValueAvailable()) {
if ($mustAutowire) {
throw new RuntimeException(sprintf('Cannot autowire argument $%s of method %s::%s() for service "%s": %s.', $parameter->name, $reflectionMethod->class, $reflectionMethod->name, $this->currentId, $e->getMessage()), 0, $e);