Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1bbb521

Browse files
committed
Convert previously defined date attribute to the expected class
1 parent b170889 commit 1bbb521

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ public function supports(Request $request, ArgumentMetadata $argument): bool
3939
public function resolve(Request $request, ArgumentMetadata $argument): iterable
4040
{
4141
$value = $request->attributes->get($argument->getName());
42+
$class = \DateTimeInterface::class === $argument->getType() ? \DateTimeImmutable::class : $argument->getType();
4243

4344
if ($value instanceof \DateTimeInterface) {
44-
yield $value;
45+
yield $value instanceof $class ? $value : $class::createFromInterface($value);
4546

4647
return;
4748
}
@@ -52,7 +53,6 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable
5253
return;
5354
}
5455

55-
$class = \DateTimeInterface::class === $argument->getType() ? \DateTimeImmutable::class : $argument->getType();
5656
$format = null;
5757

5858
if ($attributes = $argument->getAttributes(MapDateTime::class, ArgumentMetadata::IS_INSTANCEOF)) {

src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
class DateTimeValueResolverTest extends TestCase
2222
{
23-
private $defaultTimezone;
23+
private readonly string $defaultTimezone;
2424

2525
protected function setUp(): void
2626
{
@@ -32,13 +32,20 @@ protected function tearDown(): void
3232
date_default_timezone_set($this->defaultTimezone);
3333
}
3434

35-
public function getTimeZones()
35+
public static function getTimeZones()
3636
{
3737
yield ['UTC'];
3838
yield ['Etc/GMT+9'];
3939
yield ['Etc/GMT-14'];
4040
}
4141

42+
public static function getClasses()
43+
{
44+
yield [\DateTimeInterface::class];
45+
yield [\DateTime::class];
46+
yield [FooDateTime::class];
47+
}
48+
4249
public function testSupports()
4350
{
4451
$resolver = new DateTimeValueResolver();
@@ -133,19 +140,24 @@ public function testNow(string $timezone)
133140
$this->assertSame($timezone, $results[0]->getTimezone()->getName(), 'Default timezone');
134141
}
135142

136-
public function testPreviouslyConvertedAttribute()
143+
/**
144+
* @param class-string<\DateTimeInterface> $class
145+
* @dataProvider getClasses
146+
*/
147+
public function testPreviouslyConvertedAttribute(string $class)
137148
{
138149
$resolver = new DateTimeValueResolver();
139150

140-
$argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null, true);
151+
$argument = new ArgumentMetadata('dummy', $class, false, false, null, true);
141152
$request = self::requestWithAttributes(['dummy' => $datetime = new \DateTime()]);
142153

143154
/** @var \Generator $results */
144155
$results = $resolver->resolve($request, $argument);
145156
$results = iterator_to_array($results);
146157

147158
$this->assertCount(1, $results);
148-
$this->assertSame($datetime, $results[0]);
159+
$this->assertEquals($datetime, $results[0], 'The value is the same, but the class can be modified.');
160+
$this->assertInstanceOf($class, $results[0]);
149161
}
150162

151163
public function testCustomClass()
@@ -209,7 +221,7 @@ public function testWithFormat(string $timezone)
209221
$this->assertEquals('2016-09-08 12:34:56', $results[0]->format('Y-m-d H:i:s'));
210222
}
211223

212-
public function provideInvalidDates()
224+
public static function provideInvalidDates()
213225
{
214226
return [
215227
'invalid date' => [

0 commit comments

Comments
 (0)