8000 Convert previously converted attribute to match the expected type · symfony/symfony@ae845db · GitHub
[go: up one dir, main page]

Skip to content

Commit ae845db

Browse files
committed
Convert previously converted attribute to match the expected type
1 parent 0a0624e commit ae845db

File tree

2 files changed

+47
-20
lines changed

2 files changed

+47
-20
lines changed

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,20 @@ public function resolve(Request $request, ArgumentMetadata $argument): array
4949
}
5050

5151
$value = $request->attributes->get($argument->getName());
52-
53-
if ($value instanceof \DateTimeInterface) {
54-
return [$value];
55-
}
56-
57-
if ($argument->isNullable() && !$value) {
58-
return [null];
59-
}
60-
6152
$class = \DateTimeInterface::class === $argument->getType() ? \DateTimeImmutable::class : $argument->getType();
6253

63-
if ($this->clock && !$value) {
64-
$date = $this->clock->withTimeZone(date_default_timezone_get())->now();
54+
if (!$value) {
55+
if ($argument->isNullable()) {
56+
return [null];
57+
}
58+
if (!$this->clock) {
59+
return [new $class];
60+
}
61+
$value = $this->clock->withTimeZone(date_default_timezone_get())->now();
62+
}
6563

66-
return $date instanceof $class ? [$date] : [$class::createFromInterface($date)];
64+
if ($value instanceof \DateTimeInterface) {
65+
return $value instanceof $class ? [$value] : [$class::createFromInterface($value)];
6766
}
6867

6968
$format = null;

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

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,17 +123,21 @@ public function testNullableWithEmptyAttribute()
123123
$this->assertNull($results[0]);
124124
}
125125

126-
public function testPreviouslyConvertedAttribute()
126+
/**
127+
* @dataProvider getClasses
128+
*/
129+
public function testPreviouslyConvertedAttribute(string $class)
127130
{
128131
$resolver = new DateTimeValueResolver();
129132

130-
$argument = new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null, true);
133+
$argument = new ArgumentMetadata('dummy', $class, false, false, null, true);
131134
$request = self::requestWithAttributes(['dummy' => $datetime = new \DateTimeImmutable()]);
132135

133136
$results = $resolver->resolve($request, $argument);
134137

135138
$this->assertCount(1, $results);
136-
$this->assertSame($datetime, $results[0]);
139+
$this->assertEquals($datetime, $results[0], 'The value is the same, but the class can be modified.');
140+
$this->assertInstanceOf($class, $results[0]);
137141
}
138142

139143
public function testCustomClass()
@@ -224,12 +228,29 @@ public function test404Exception(ArgumentMetadata $argument, Request $request)
224228

225229
/**
226230
* @param class-string<\DateTimeInterface> $class
227-
*
228-
* @testWith ["DateTimeInterface"]
229-
* ["DateTimeImmutable"]
230-
* ["DateTime"]
231+
* @dataProvider getClasses
232+
*/
233+
public function testNow(string $class)
234+
{
235+
date_default_timezone_set($timezone = 'Etc/GMT+9');
236+
$resolver = new DateTimeValueResolver();
237+
238+
$argument = new ArgumentMetadata('dummy', $class, false, false, null, false);
239+
$request = self::requestWithAttributes(['dummy' => null]);
240+
241+
$results = $resolver->resolve($request, $argument);
242+
243+
$this->assertCount(1, $results);
244+
$this->assertInstanceOf($class, $results[0]);
245+
$this->assertSame($timezone, $results[0]->getTimezone()->getName(), 'Default timezone');
246+
$this->assertEquals('0', $results[0]->diff(new \DateTimeImmutable())->format('%s'));
247+
}
248+
249+
/**
250+
* @param class-string<\DateTimeInterface> $class
251+
* @dataProvider getClasses
231252
*/
232-
public function testNowFromClock(string $class)
253+
public function testNowWithClock(string $class)
233254
{
234255
date_default_timezone_set($timezone = 'Etc/GMT+9');
235256
$clock = new MockClock('2022-02-20 22:20:02');
@@ -246,6 +267,13 @@ public function testNowFromClock(string $class)
246267
$this->assertEquals($clock->now(), $results[0]);
247268
}
248269

270+
public function getClasses()
271+
{
272+
yield [\DateTimeInterface::class];
273+
yield [\DateTime::class];
274+
yield [FooDateTime::class];
275+
}
276+
249277
private static function requestWithAttributes(array $attributes): Request
250278
{
251279
$request = Request::create('/');

0 commit comments

Comments
 (0)
0