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 1ed2f2a0afff6..ab346b267ff87 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 a90cc86ddf2d3..acb607da83a85 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(); 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