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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy