From 22a1567d01a7c6409f3afb7448267c9c98fb9767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Sat, 26 Nov 2022 21:37:00 +0100 Subject: [PATCH] Convert previously defined date attribute to the expected class --- .../DateTimeValueResolver.php | 4 +-- .../DateTimeValueResolverTest.php | 25 ++++++++++++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php index e9a7494a4c761..f014b5bcb82df 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php @@ -39,9 +39,10 @@ public function supports(Request $request, ArgumentMetadata $argument): bool public function resolve(Request $request, ArgumentMetadata $argument): iterable { $value = $request->attributes->get($argument->getName()); + $class = \DateTimeInterface::class === $argument->getType() ? \DateTimeImmutable::class : $argument->getType(); if ($value instanceof \DateTimeInterface) { - yield $value; + yield $value instanceof $class ? $value : $class::createFromInterface($value); return; } @@ -52,7 +53,6 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable return; } - $class = \DateTimeInterface::class === $argument->getType() ? \DateTimeImmutable::class : $argument->getType(); $format = null; if ($attributes = $argument->getAttributes(MapDateTime::class, ArgumentMetadata::IS_INSTANCEOF)) { diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php index b438c527a32da..ac10dfc1a5ea7 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php @@ -20,7 +20,7 @@ class DateTimeValueResolverTest extends TestCase { - private $defaultTimezone; + private readonly string $defaultTimezone; protected function setUp(): void { @@ -32,13 +32,20 @@ protected function tearDown(): void date_default_timezone_set($this->defaultTimezone); } - public function getTimeZones() + public static function getTimeZones() { yield ['UTC']; yield ['Etc/GMT+9']; yield ['Etc/GMT-14']; } + public static function getClasses() + { + yield [\DateTimeInterface::class]; + yield [\DateTime::class]; + yield [FooDateTime::class]; + } + public function testSupports() { $resolver = new DateTimeValueResolver(); @@ -133,11 +140,16 @@ public function testNow(string $timezone) $this->assertSame($timezone, $results[0]->getTimezone()->getName(), 'Default timezone'); } - public function testPreviouslyConvertedAttribute() + /** + * @param class-string<\DateTimeInterface> $class + * + * @dataProvider getClasses + */ + public function testPreviouslyConvertedAttribute(string $class) { $resolver = new DateTimeValueResolver(); - $argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null, true); + $argument = new ArgumentMetadata('dummy', $class, false, false, null, true); $request = self::requestWithAttributes(['dummy' => $datetime = new \DateTime()]); /** @var \Generator $results */ @@ -145,7 +157,8 @@ public function testPreviouslyConvertedAttribute() $results = iterator_to_array($results); $this->assertCount(1, $results); - $this->assertSame($datetime, $results[0]); + $this->assertEquals($datetime, $results[0], 'The value is the same, but the class can be modified.'); + $this->assertInstanceOf($class, $results[0]); } public function testCustomClass() @@ -209,7 +222,7 @@ public function testWithFormat(string $timezone) $this->assertEquals('2016-09-08 12:34:56', $results[0]->format('Y-m-d H:i:s')); } - public function provideInvalidDates() + public static function provideInvalidDates() { return [ 'invalid date' => [