diff --git a/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php b/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php index 461c50cce6c6..2a11626fe2bf 100644 --- a/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php +++ b/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php @@ -25,6 +25,11 @@ public function __construct(string $serviceId, string $type, \ReflectionParamete $acceptedType = $acceptedType instanceof \ReflectionNamedType ? $acceptedType->getName() : (string) $acceptedType; $this->code = $type; - parent::__construct(sprintf('Invalid definition for service "%s": argument %d of "%s::%s()" accepts "%s", "%s" passed.', $serviceId, 1 + $parameter->getPosition(), $parameter->getDeclaringClass()->getName(), $parameter->getDeclaringFunction()->getName(), $acceptedType, $type)); + $function = $parameter->getDeclaringFunction(); + $functionName = $function instanceof \ReflectionMethod + ? sprintf('%s::%s', $function->getDeclaringClass()->getName(), $function->getName()) + : $function->getName(); + + parent::__construct(sprintf('Invalid definition for service "%s": argument %d of "%s()" accepts "%s", "%s" passed.', $serviceId, 1 + $parameter->getPosition(), $functionName, $acceptedType, $type)); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php b/src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php new file mode 100644 index 000000000000..d61388ea2dd7 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Tests\Exception; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException; + +final class InvalidParameterTypeExceptionTest extends TestCase +{ + /** + * @dataProvider provideReflectionParameters + */ + public function testExceptionMessage(\ReflectionParameter $parameter, string $expectedMessage) + { + $exception = new InvalidParameterTypeException('my_service', 'int', $parameter); + + self::assertSame($expectedMessage, $exception->getMessage()); + } + + public function provideReflectionParameters(): iterable + { + yield 'static method' => [ + new \ReflectionParameter([MyClass::class, 'doSomething'], 0), + 'Invalid definition for service "my_service": argument 1 of "Symfony\Component\DependencyInjection\Tests\Exception\MyClass::doSomething()" accepts "array", "int" passed.', + ]; + + yield 'function' => [ + new \ReflectionParameter(__NAMESPACE__.'\\myFunction', 0), + 'Invalid definition for service "my_service": argument 1 of "Symfony\Component\DependencyInjection\Tests\Exception\myFunction()" accepts "array", "int" passed.', + ]; + } +} + +class MyClass +{ + public static function doSomething(array $arguments): void + { + } +} + +function myFunction(array $arguments): void +{ +}