From 56f3df494c1d3be1e6df3a869b2e9e8099bc0b2e Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 7 Jan 2025 18:11:41 +0100 Subject: [PATCH] [HttpFoundation][FrameworkBundle] Reset Request's formats using the service resetter --- .../Command/ContainerDebugCommand.php | 8 ++++++-- .../FrameworkBundle/Resources/config/services.php | 1 + .../Tests/Functional/ContainerDebugCommandTest.php | 12 ++++++------ .../Component/HttpFoundation/RequestStack.php | 7 +++++++ .../HttpFoundation/Tests/RequestStackTest.php | 14 ++++++++++++++ 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php index df6aef5dd6b3e..3000da51a7a11 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php @@ -284,7 +284,9 @@ private function findProperServiceName(InputInterface $input, SymfonyStyle $io, return $matchingServices[0]; } - return $io->choice('Select one of the following services to display its information', $matchingServices); + natsort($matchingServices); + + return $io->choice('Select one of the following services to display its information', array_values($matchingServices)); } private function findProperTagName(InputInterface $input, SymfonyStyle $io, ContainerBuilder $container, string $tagName): string @@ -302,7 +304,9 @@ private function findProperTagName(InputInterface $input, SymfonyStyle $io, Cont return $matchingTags[0]; } - return $io->choice('Select one of the following tags to display its information', $matchingTags); + natsort($matchingTags); + + return $io->choice('Select one of the following tags to display its information', array_values($matchingTags)); } private function findServiceIdsContaining(ContainerBuilder $container, string $name, bool $showHidden): array diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php index 905e16f9b9e9c..5f280bdfbb242 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php @@ -100,6 +100,7 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : [] ->alias(HttpKernelInterface::class, 'http_kernel') ->set('request_stack', RequestStack::class) + ->tag('kernel.reset', ['method' => 'resetRequestFormats', 'on_invalid' => 'ignore']) ->public() ->alias(RequestStack::class, 'request_stack') diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php index efbc1f54acb08..1adddd1832500 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php @@ -140,13 +140,13 @@ public function testTagsPartialSearch() $tester->run(['command' => 'debug:container', '--tag' => 'kernel.'], ['decorated' => false]); $this->assertStringContainsString('Select one of the following tags to display its information', $tester->getDisplay()); - $this->assertStringContainsString('[0] kernel.event_subscriber', $tester->getDisplay()); - $this->assertStringContainsString('[1] kernel.locale_aware', $tester->getDisplay()); - $this->assertStringContainsString('[2] kernel.cache_warmer', $tester->getDisplay()); + $this->assertStringContainsString('[0] kernel.cache_clearer', $tester->getDisplay()); + $this->assertStringContainsString('[1] kernel.cache_warmer', $tester->getDisplay()); + $this->assertStringContainsString('[2] kernel.event_subscriber', $tester->getDisplay()); $this->assertStringContainsString('[3] kernel.fragment_renderer', $tester->getDisplay()); - $this->assertStringContainsString('[4] kernel.reset', $tester->getDisplay()); - $this->assertStringContainsString('[5] kernel.cache_clearer', $tester->getDisplay()); - $this->assertStringContainsString('Symfony Container Services Tagged with "kernel.event_subscriber" Tag', $tester->getDisplay()); + $this->assertStringContainsString('[4] kernel.locale_aware', $tester->getDisplay()); + $this->assertStringContainsString('[5] kernel.reset', $tester->getDisplay()); + $this->assertStringContainsString('Symfony Container Services Tagged with "kernel.cache_clearer" Tag', $tester->getDisplay()); } public function testDescribeEnvVars() diff --git a/src/Symfony/Component/HttpFoundation/RequestStack.php b/src/Symfony/Component/HttpFoundation/RequestStack.php index 5aa8ba793414c..ca61eef2953e2 100644 --- a/src/Symfony/Component/HttpFoundation/RequestStack.php +++ b/src/Symfony/Component/HttpFoundation/RequestStack.php @@ -106,4 +106,11 @@ public function getSession(): SessionInterface throw new SessionNotFoundException(); } + + public function resetRequestFormats(): void + { + static $resetRequestFormats; + $resetRequestFormats ??= \Closure::bind(static fn () => self::$formats = null, null, Request::class); + $resetRequestFormats(); + } } diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php index 2b26ce5c64aea..3b958653f0bfa 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php @@ -67,4 +67,18 @@ public function testGetParentRequest() $requestStack->push($secondSubRequest); $this->assertSame($firstSubRequest, $requestStack->getParentRequest()); } + + public function testResetRequestFormats() + { + $requestStack = new RequestStack(); + + $request = Request::create('/foo'); + $request->setFormat('foo', ['application/foo']); + + $this->assertSame(['application/foo'], $request->getMimeTypes('foo')); + + $requestStack->resetRequestFormats(); + + $this->assertSame([], $request->getMimeTypes('foo')); + } }