Skip to content

Commit 2e28c56

Browse files
committed
feature #47730 Ban DateTime from the codebase (WebMamba)
This PR was squashed before being merged into the 6.2 branch. Discussion ---------- Ban DateTime from the codebase | Q | A | ------------- | --- | Branch? | 6.2 | Bug fix? | no | New feature? | yes | Deprecations? | yes | Tickets | #47580 | License | MIT | Doc PR | symfony As discuss in this issue, the purpose of this PR is to remove DateTime from the code base in favor to DateTimeImmutable. I will process it component by component. Feel free to discuss! Commits ------- 689385a83f Ban DateTime from the codebase
2 parents 3a2c924 + b88571e commit 2e28c56

File tree

13 files changed

+61
-61
lines changed

13 files changed

+61
-61
lines changed

DataCollector/ConfigDataCollector.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ public function setKernel(KernelInterface $kernel = null)
4040

4141
public function collect(Request $request, Response $response, \Throwable $exception = null)
4242
{
43-
$eom = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE);
44-
$eol = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE);
43+
$eom = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE);
44+
$eol = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE);
4545

4646
$this->data = [
4747
'token' => $response->headers->get('X-Debug-Token'),
@@ -244,9 +244,9 @@ public function getName(): string
244244

245245
private function determineSymfonyState(): string
246246
{
247-
$now = new \DateTime();
248-
$eom = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->modify('last day of this month');
249-
$eol = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->modify('last day of this month');
247+
$now = new \DateTimeImmutable();
248+
$eom = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->modify('last day of this month');
249+
$eol = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->modify('last day of this month');
250250

251251
if ($now > $eol) {
252252
$versionState = 'eol';

EventListener/AbstractSessionListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public function onKernelResponse(ResponseEvent $event)
196196

197197
if ($autoCacheControl) {
198198
$response
199-
->setExpires(new \DateTime())
199+
->setExpires(new \DateTimeImmutable())
200200
->setPrivate()
201201
->setMaxAge(0)
202202
->headers->addCacheControlDirective('must-revalidate');

HttpCache/HttpCache.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ protected function forward(Request $request, bool $catch = false, Response $entr
508508
Anyway, a client that received a message without a "Date" header MUST add it.
509509
*/
510510
if (!$response->headers->has('Date')) {
511-
$response->setDate(\DateTime::createFromFormat('U', time()));
511+
$response->setDate(\DateTimeImmutable::createFromFormat('U', time()));
512512
}
513513

514514
$this->processResponseBody($request, $response);

Log/Logger.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private function format(string $level, string $message, array $context, bool $pr
9595
if (null === $val || \is_scalar($val) || $val instanceof \Stringable) {
9696
$replacements["{{$key}}"] = $val;
9797
} elseif ($val instanceof \DateTimeInterface) {
98-
$replacements["{{$key}}"] = $val->format(\DateTime::RFC3339);
98+
$replacements["{{$key}}"] = $val->format(\DateTimeInterface::RFC3339);
9999
} elseif (\is_object($val)) {
100100
$replacements["{{$key}}"] = '[object '.$val::class.']';
101101
} else {
@@ -108,7 +108,7 @@ private function format(string $level, string $message, array $context, bool $pr
108108

109109
$log = sprintf('[%s] %s', $level, $message).\PHP_EOL;
110110
if ($prefixDate) {
111-
$log = date(\DateTime::RFC3339).' '.$log;
111+
$log = date(\DateTimeInterface::RFC3339).' '.$log;
112112
}
113113

114114
return $log;

Profiler/Profiler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ private function getTimestamp(?string $value): ?int
232232
}
233233

234234
try {
235-
$value = new \DateTime(is_numeric($value) ? '@'.$value : $value);
235+
$value = new \DateTimeImmutable(is_numeric($value) ? '@'.$value : $value);
236236
} catch (\Exception) {
237237
return null;
238238
}

Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ public function testFullDate(string $timezone)
7676
date_default_timezone_set($timezone);
7777
$resolver = new DateTimeValueResolver();
7878

79-
$argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null);
79+
$argument = new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null);
8080
$request = self::requestWithAttributes(['dummy' => '2012-07-21 00:00:00']);
8181

8282
$results = $resolver->resolve($request, $argument);
8383

8484
$this->assertCount(1, $results);
85-
$this->assertInstanceOf(\DateTime::class, $results[0]);
85+
$this->assertInstanceOf(\DateTimeImmutable::class, $results[0]);
8686
$this->assertSame($timezone, $results[0]->getTimezone()->getName(), 'Default timezone');
8787
$this->assertEquals('2012-07-21 00:00:00', $results[0]->format('Y-m-d H:i:s'));
8888
}
@@ -95,13 +95,13 @@ public function testUnixTimestamp(string $timezone)
9595
date_default_timezone_set($timezone);
9696
$resolver = new DateTimeValueResolver();
9797

98-
$argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null);
98+
$argument = new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null);
9999
$request = self::requestWithAttributes(['dummy' => '989541720']);
100100

101101
$results = $resolver->resolve($request, $argument);
102102

103103
$this->assertCount(1, $results);
104-
$this->assertInstanceOf(\DateTime::class, $results[0]);
104+
$this->assertInstanceOf(\DateTimeImmutable::class, $results[0]);
105105
$this->assertSame('+00:00', $results[0]->getTimezone()->getName(), 'Timestamps are UTC');
106106
$this->assertEquals('2001-05-11 00:42:00', $results[0]->format('Y-m-d H:i:s'));
107107
}
@@ -110,7 +110,7 @@ public function testNullableWithEmptyAttribute()
110110
{
111111
$resolver = new DateTimeValueResolver();
112112

113-
$argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null, true);
113+
$argument = new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null, true);
114114
$request = self::requestWithAttributes(['dummy' => '']);
115115

116116
$results = $resolver->resolve($request, $argument);
@@ -123,8 +123,8 @@ public function testPreviouslyConvertedAttribute()
123123
{
124124
$resolver = new DateTimeValueResolver();
125125

126-
$argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null, true);
127-
$request = self::requestWithAttributes(['dummy' => $datetime = new \DateTime()]);
126+
$argument = new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null, true);
127+
$request = self::requestWithAttributes(['dummy' => $datetime = new \DateTimeImmutable()]);
128128

129129
$results = $resolver->resolve($request, $argument);
130130

@@ -191,15 +191,15 @@ public function provideInvalidDates()
191191
{
192192
return [
193193
'invalid date' => [
194-
new ArgumentMetadata('dummy', \DateTime::class, false, false, null),
194+
new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null),
195195
self::requestWithAttributes(['dummy' => 'Invalid DateTime Format']),
196196
],
197197
'invalid format' => [
198-
new ArgumentMetadata('dummy', \DateTime::class, false, false, null, false, [new MapDateTime(format: 'd.m.Y')]),
198+
new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null, false, [new MapDateTime(format: 'd.m.Y')]),
199199
self::requestWithAttributes(['dummy' => '2012-07-21']),
200200
],
201201
'invalid ymd format' => [
202-
new ArgumentMetadata('dummy', \DateTime::class, false, false, null, false, [new MapDateTime(format: 'Y-m-d')]),
202+
new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null, false, [new MapDateTime(format: 'Y-m-d')]),
203203
self::requestWithAttributes(['dummy' => '2012-21-07']),
204204
],
205205
];
@@ -230,6 +230,6 @@ private static function requestWithAttributes(array $attributes): Request
230230
}
231231
}
232232

233-
class FooDateTime extends \DateTime
233+
class FooDateTime extends \DateTimeImmutable
234234
{
235235
}

Tests/DataCollector/ConfigDataCollectorTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public function testCollect()
4444
$this->assertSame(sprintf('%s.%s', Kernel::MAJOR_VERSION, Kernel::MINOR_VERSION), $c->getSymfonyMinorVersion());
4545
$this->assertContains($c->getSymfonyState(), ['eol', 'eom', 'dev', 'stable']);
4646

47-
$eom = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->format('F Y');
48-
$eol = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->format('F Y');
47+
$eom = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->format('F Y');
48+
$eol = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->format('F Y');
4949
$this->assertSame($eom, $c->getSymfonyEom());
5050
$this->assertSame($eol, $c->getSymfonyEol());
5151
}
@@ -72,8 +72,8 @@ public function testCollectWithoutKernel()
7272
$this->assertSame(sprintf('%s.%s', Kernel::MAJOR_VERSION, Kernel::MINOR_VERSION), $c->getSymfonyMinorVersion());
7373
$this->assertContains($c->getSymfonyState(), ['eol', 'eom', 'dev', 'stable']);
7474

75-
$eom = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->format('F Y');
76-
$eol = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->format('F Y');
75+
$eom = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->format('F Y');
76+
$eol = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->format('F Y');
7777
$this->assertSame($eom, $c->getSymfonyEom());
7878
$this->assertSame($eol, $c->getSymfonyEol());
7979
}

Tests/DataCollector/RequestDataCollectorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ protected function createResponse()
373373
$response->headers->set('Content-Type', 'application/json');
374374
$response->headers->set('X-Foo-Bar', null);
375375
$response->headers->setCookie(new Cookie('foo', 'bar', 1, '/foo', 'localhost', true, true, false, null));
376-
$response->headers->setCookie(new Cookie('bar', 'foo', new \DateTime('@946684800'), '/', null, false, true, false, null));
376+
$response->headers->setCookie(new Cookie('bar', 'foo', new \DateTimeImmutable('@946684800'), '/', null, false, true, false, null));
377377
$response->headers->setCookie(new Cookie('bazz', 'foo', '2000-12-12', '/', null, false, true, false, null));
378378

379379
return $response;

Tests/EventListener/CacheAttributeListenerTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,8 @@ public function testConfigurationDoesNotOverrideAlreadySetResponseHeaders()
259259

260260
$response = new Response();
261261
$response->setEtag('"54321"');
262-
$response->setLastModified(new \DateTime('Fri, 23 Aug 2014 00:00:00 GMT'));
263-
$response->setExpires(new \DateTime('Fri, 24 Aug 2014 00:00:00 GMT'));
262+
$response->setLastModified(new \DateTimeImmutable('Fri, 23 Aug 2014 00:00:00 GMT'));
263+
$response->setExpires(new \DateTimeImmutable('Fri, 24 Aug 2014 00:00:00 GMT'));
264264
$response->setSharedMaxAge(30);
265265
$response->setMaxAge(30);
266266
$response->setVary(['foobaz']);
@@ -270,8 +270,8 @@ public function testConfigurationDoesNotOverrideAlreadySetResponseHeaders()
270270
$listener->onKernelResponse($responseEvent);
271271

272272
$this->assertSame('"54321"', $response->getEtag());
273-
$this->assertEquals(new \DateTime('Fri, 23 Aug 2014 00:00:00 GMT'), $response->getLastModified());
274-
$this->assertEquals(new \DateTime('Fri, 24 Aug 2014 00:00:00 GMT'), $response->getExpires());
273+
$this->assertEquals(new \DateTimeImmutable('Fri, 23 Aug 2014 00:00:00 GMT'), $response->getLastModified());
274+
$this->assertEquals(new \DateTimeImmutable('Fri, 24 Aug 2014 00:00:00 GMT'), $response->getExpires());
275275
$this->assertSame('30', $response->headers->getCacheControlDirective('s-maxage'));
276276
$this->assertSame(30, $response->getMaxAge());
277277
$this->assertSame(['foobaz'], $response->getVary());
@@ -320,7 +320,7 @@ class TestEntity
320320
{
321321
public function getDate()
322322
{
323-
return new \DateTime('Fri, 23 Aug 2013 00:00:00 GMT');
323+
return new \DateTimeImmutable('Fri, 23 Aug 2013 00:00:00 GMT');
324324
}
325325

326326
public function getId()

Tests/EventListener/SessionListenerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ public function testResponseIsPrivateIfSessionStarted()
457457
$this->assertTrue($response->headers->hasCacheControlDirective('private'));
458458
$this->assertTrue($response->headers->hasCacheControlDirective('must-revalidate'));
459459
$this->assertSame('0', $response->headers->getCacheControlDirective('max-age'));
460-
$this->assertLessThanOrEqual(new \DateTime('now', new \DateTimeZone('UTC')), new \DateTime($response->headers->get('Expires')));
460+
$this->assertLessThanOrEqual(new \DateTimeImmutable('now', new \DateTimeZone('UTC')), new \DateTimeImmutable($response->headers->get('Expires')));
461461
$this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER));
462462
}
463463

@@ -591,7 +591,7 @@ public function testSurrogateMainRequestIsPublic()
591591
$this->assertSame('0', $response->headers->getCacheControlDirective('max-age'));
592592

593593
$this->assertTrue($response->headers->has('Expires'));
594-
$this->assertLessThanOrEqual(new \DateTime('now', new \DateTimeZone('UTC')), new \DateTime($response->headers->get('Expires')));
594+
$this->assertLessThanOrEqual(new \DateTimeImmutable('now', new \DateTimeZone('UTC')), new \DateTimeImmutable($response->headers->get('Expires')));
595595
}
596596

597597
public function testGetSessionIsCalledOnce()

0 commit comments

Comments
 (0)