From 406bfc9896497611999c0fad192283a375a3f0d5 Mon Sep 17 00:00:00 2001 From: Amrouche Hamza Date: Thu, 22 Feb 2018 14:50:48 +0100 Subject: [PATCH] [FrameworkBundle] keep query params in redirection --- .../Controller/RedirectController.php | 3 +- .../Controller/RedirectControllerTest.php | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php b/src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php index 1ed2f2a0afff..ab346b267ff8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php +++ b/src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php @@ -54,7 +54,7 @@ public function __construct(UrlGeneratorInterface $router = null, int $httpPort * * @throws HttpException In case the route name is empty */ - public function redirectAction(Request $request, string $route, bool $permanent = false, $ignoreAttributes = false, bool $keepRequestMethod = false): Response + public function redirectAction(Request $request, string $route, bool $permanent = false, $ignoreAttributes = false, bool $keepRequestMethod = false, bool $keepQueryParams = false): Response { if ('' == $route) { throw new HttpException($permanent ? 410 : 404); @@ -63,6 +63,7 @@ public function redirectAction(Request $request, string $route, bool $permanent $attributes = array(); if (false === $ignoreAttributes || is_array($ignoreAttributes)) { $attributes = $request->attributes->get('_route_params'); + $attributes = $keepQueryParams ? array_merge($request->query->all(), $attributes) : $attributes; unset($attributes['route'], $attributes['permanent'], $attributes['ignoreAttributes'], $attributes['keepRequestMethod']); if ($ignoreAttributes) { $attributes = array_diff_key($attributes, array_flip($ignoreAttributes)); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/RedirectControllerTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/RedirectControllerTest.php index a90cc86ddf2d..acb607da83a8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/RedirectControllerTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/RedirectControllerTest.php @@ -235,6 +235,40 @@ public function testPathQueryParams($expectedUrl, $path, $queryString) $this->assertRedirectUrl($returnValue, $expectedUrl); } + public function testRedirectWithQuery() + { + $scheme = 'http'; + $host = 'www.example.com'; + $baseUrl = '/base'; + $port = 80; + + $request = $this->createRequestObject($scheme, $host, $port, $baseUrl, 'base=zaza'); + $request->query = new ParameterBag(array('base' => 'zaza')); + $request->attributes = new ParameterBag(array('_route_params' => array('base2' => 'zaza'))); + $urlGenerator = $this->getMockBuilder(UrlGeneratorInterface::class)->getMock(); + $urlGenerator->expects($this->once())->method('generate')->will($this->returnValue('/test?base=zaza&base2=zaza'))->with('/test', array('base' => 'zaza', 'base2' => 'zaza'), UrlGeneratorInterface::ABSOLUTE_URL); + + $controller = new RedirectController($urlGenerator); + $this->assertRedirectUrl($controller->redirectAction($request, '/test', false, false, false, true), '/test?base=zaza&base2=zaza'); + } + + public function testRedirectWithQueryWithRouteParamsOveriding() + { + $scheme = 'http'; + $host = 'www.example.com'; + $baseUrl = '/base'; + $port = 80; + + $request = $this->createRequestObject($scheme, $host, $port, $baseUrl, 'base=zaza'); + $request->query = new ParameterBag(array('base' => 'zaza')); + $request->attributes = new ParameterBag(array('_route_params' => array('base' => 'zouzou'))); + $urlGenerator = $this->getMockBuilder(UrlGeneratorInterface::class)->getMock(); + $urlGenerator->expects($this->once())->method('generate')->will($this->returnValue('/test?base=zouzou'))->with('/test', array('base' => 'zouzou'), UrlGeneratorInterface::ABSOLUTE_URL); + + $controller = new RedirectController($urlGenerator); + $this->assertRedirectUrl($controller->redirectAction($request, '/test', false, false, false, true), '/test?base=zouzou'); + } + private function createRequestObject($scheme, $host, $port, $baseUrl, $queryString = '') { $request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')->getMock();