diff --git a/core/lib/Drupal/Core/Controller/TitleResolver.php b/core/lib/Drupal/Core/Controller/TitleResolver.php index 85fce7732c1036c710504c34d2f4be0d5eeff06b..2cf06eca7e4acbdd578dee00e3a521f5b4bb8e21 100644 --- a/core/lib/Drupal/Core/Controller/TitleResolver.php +++ b/core/lib/Drupal/Core/Controller/TitleResolver.php @@ -65,8 +65,8 @@ public function getTitle(Request $request, Route $route) { $args = []; if (($raw_parameters = $request->attributes->get('_raw_variables'))) { foreach ($raw_parameters->all() as $key => $value) { - $args['@' . $key] = $value; - $args['%' . $key] = $value; + $args['@' . $key] = $value ?? ''; + $args['%' . $key] = $value ?? ''; } } if ($title_arguments = $route->getDefault('_title_arguments')) { diff --git a/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php b/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php index 27a654559a3d0ad1cb74d153a8b1d637ead1c29a..3c26a05651279bd5b2bd9ad46ba488b1c18c8ed3 100644 --- a/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php +++ b/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php @@ -102,6 +102,24 @@ public function providerTestStaticTitleWithParameter() { ]; } + /** + * Tests a static title with a NULL value parameter. + * + * @see \Drupal\Core\Controller\TitleResolver::getTitle() + */ + public function testStaticTitleWithNullValueParameter() { + $raw_variables = new ParameterBag(['test' => NULL, 'test2' => 'value']); + $request = new Request(); + $request->attributes->set('_raw_variables', $raw_variables); + + $route = new Route('/test-route', ['_title' => 'static title %test @test']); + $translatable_markup = $this->titleResolver->getTitle($request, $route); + $this->assertSame('', $translatable_markup->getArguments()['@test']); + $this->assertSame('', $translatable_markup->getArguments()['%test']); + $this->assertSame('value', $translatable_markup->getArguments()['@test2']); + $this->assertSame('value', $translatable_markup->getArguments()['%test2']); + } + /** * Tests a dynamic title. *