From 53b1677a4e82d7c11b3dc99eeb4c1c2264947ef5 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Thu, 21 May 2020 13:30:55 +0200 Subject: [PATCH] Address deprecation of ReflectionType::getClass(). --- .../Compiler/AutowirePass.php | 11 +++++++++- .../Controller/ControllerResolver.php | 20 ++++++++++++++++++- .../OptionsResolver/OptionsResolver.php | 18 ++++++++++++++++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 91b279c77a25..d97f121ab9c3 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -525,7 +525,16 @@ private static function getResourceMetadataForMethod(\ReflectionMethod $method) $methodArgumentsMetadata = []; foreach ($method->getParameters() as $parameter) { try { - $class = $parameter->getClass(); + if (method_exists($parameter, 'getType')) { + $type = $parameter->getType(); + if ($type && !$type->isBuiltin()) { + $class = new \ReflectionClass(method_exists($type, 'getName') ? $type->getName() : (string) $type); + } else { + $class = null; + } + } else { + $class = $parameter->getClass(); + } } catch (\ReflectionException $e) { // type-hint is against a non-existent class $class = false; diff --git a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php index e3a7211c1be2..688d574cebe0 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php @@ -136,7 +136,7 @@ protected function doGetArguments(Request $request, $controller, array $paramete } else { $arguments[] = $attributes[$param->name]; } - } elseif ($param->getClass() && $param->getClass()->isInstance($request)) { + } elseif ($this->typeMatchesRequestClass($param, $request)) { $arguments[] = $request; } elseif ($param->isDefaultValueAvailable()) { $arguments[] = $param->getDefaultValue(); @@ -260,4 +260,22 @@ private function getControllerError($callable) return $message; } + + /** + * @return bool + */ + private function typeMatchesRequestClass(\ReflectionParameter $param, Request $request) + { + if (!method_exists($param, 'getType')) { + return $param->getClass() && $param->getClass()->isInstance($request); + } + + if (!($type = $param->getType()) || $type->isBuiltin()) { + return false; + } + + $class = new \ReflectionClass(method_exists($type, 'getName') ? $type->getName() : (string) $type); + + return $class && $class->isInstance($request); + } } diff --git a/src/Symfony/Component/OptionsResolver/OptionsResolver.php b/src/Symfony/Component/OptionsResolver/OptionsResolver.php index fd8a603fe24c..7354caf8a6fe 100644 --- a/src/Symfony/Component/OptionsResolver/OptionsResolver.php +++ b/src/Symfony/Component/OptionsResolver/OptionsResolver.php @@ -146,7 +146,7 @@ public function setDefault($option, $value) $reflClosure = new \ReflectionFunction($value); $params = $reflClosure->getParameters(); - if (isset($params[0]) && null !== ($class = $params[0]->getClass()) && Options::class === $class->name) { + if (isset($params[0]) && Options::class === $this->getParameterClassName($params[0])) { // Initialize the option if no previous value exists if (!isset($this->defaults[$option])) { $this->defaults[$option] = null; @@ -1066,4 +1066,20 @@ private static function isValueValidType($type, $value) { return (\function_exists($isFunction = 'is_'.$type) && $isFunction($value)) || $value instanceof $type; } + + /** + * @return string|null + */ + private function getParameterClassName(\ReflectionParameter $parameter) + { + if (!method_exists($parameter, 'getType')) { + return ($class = $parameter->getClass()) ? $class->name : null; + } + + if (!($type = $parameter->getType()) || $type->isBuiltin()) { + return null; + } + + return method_exists($type, 'getName') ? $type->getName() : (string) $type; + } }