From 5b0825740a366adc32080bdd132d7fe3f7cc51d6 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Mon, 4 Dec 2023 13:07:31 +0100 Subject: [PATCH] [HttpKernel] Catch `TypeError` if the wrong type is used in `BackedEnumValueResolver` --- .../BackedEnumValueResolver.php | 2 +- .../BackedEnumValueResolverTest.php | 13 +++++++++++++ .../HttpKernel/Tests/Fixtures/IntEnum.php | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/HttpKernel/Tests/Fixtures/IntEnum.php diff --git a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/BackedEnumValueResolver.php b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/BackedEnumValueResolver.php index 4f0ca76d30226..620e2de080a35 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/BackedEnumValueResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/BackedEnumValueResolver.php @@ -86,7 +86,7 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable try { return [$enumType::from($value)]; - } catch (\ValueError $e) { + } catch (\ValueError|\TypeError $e) { throw new NotFoundHttpException(sprintf('Could not resolve the "%s $%s" controller argument: ', $argument->getType(), $argument->getName()).$e->getMessage(), $e); } } diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/BackedEnumValueResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/BackedEnumValueResolverTest.php index 9e2986273653a..9dc6a083123f5 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/BackedEnumValueResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/BackedEnumValueResolverTest.php @@ -16,6 +16,7 @@ use Symfony\Component\HttpKernel\Controller\ArgumentResolver\BackedEnumValueResolver; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\HttpKernel\Tests\Fixtures\IntEnum; use Symfony\Component\HttpKernel\Tests\Fixtures\Suit; class BackedEnumValueResolverTest extends TestCase @@ -134,6 +135,18 @@ public function testResolveThrowsOnUnexpectedType() $resolver->resolve($request, $metadata); } + public function testResolveThrowsOnTypeError() + { + $resolver = new BackedEnumValueResolver(); + $request = self::createRequest(['suit' => 'value']); + $metadata = self::createArgumentMetadata('suit', IntEnum::class); + + $this->expectException(NotFoundHttpException::class); + $this->expectExceptionMessage('Could not resolve the "Symfony\Component\HttpKernel\Tests\Fixtures\IntEnum $suit" controller argument: Symfony\Component\HttpKernel\Tests\Fixtures\IntEnum::from(): Argument #1 ($value) must be of type int, string given'); + + $resolver->resolve($request, $metadata); + } + private static function createRequest(array $attributes = []): Request { return new Request([], [], $attributes); diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/IntEnum.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/IntEnum.php new file mode 100644 index 0000000000000..8f694553b9f0c --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/IntEnum.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Tests\Fixtures; + +enum IntEnum: int +{ + case One = 1; + case Two = 2; +}