diff --git a/src/Routing/Middleware/RoutingMiddleware.php b/src/Routing/Middleware/RoutingMiddleware.php index c60056b236d..86fdcd490bc 100644 --- a/src/Routing/Middleware/RoutingMiddleware.php +++ b/src/Routing/Middleware/RoutingMiddleware.php @@ -88,7 +88,7 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res if (is_array($parsedBody) && isset($parsedBody['_method'])) { $request = $request->withMethod($parsedBody['_method']); } - $params = Router::parseRequest($request); + $params = Router::parseRequest($request) + $params; if (isset($params['_middleware'])) { $middleware = $params['_middleware']; unset($params['_middleware']); diff --git a/tests/TestCase/Routing/Middleware/RoutingMiddlewareTest.php b/tests/TestCase/Routing/Middleware/RoutingMiddlewareTest.php index d47318b0a29..9321a3988e3 100644 --- a/tests/TestCase/Routing/Middleware/RoutingMiddlewareTest.php +++ b/tests/TestCase/Routing/Middleware/RoutingMiddlewareTest.php @@ -105,6 +105,31 @@ public function testRouterSetParams() $middleware($request, $response, $next); } + /** + * Test routing middleware does wipe off existing params keys. + * + * @return void + */ + public function testPreservingExistingParams() + { + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']); + $request = $request->withAttribute('params', ['_csrfToken' => 'i-am-groot']); + $response = new Response(); + $next = function ($req, $res) { + $expected = [ + 'controller' => 'Articles', + 'action' => 'index', + 'plugin' => null, + 'pass' => [], + '_matchedRoute' => '/articles', + '_csrfToken' => 'i-am-groot' + ]; + $this->assertEquals($expected, $req->getAttribute('params')); + }; + $middleware = new RoutingMiddleware(); + $middleware($request, $response, $next); + } + /** * Test middleware invoking hook method *