diff --git a/src/Routing/Route/Route.php b/src/Routing/Route/Route.php index f2212ca97b3..0a2f9764bbe 100644 --- a/src/Routing/Route/Route.php +++ b/src/Routing/Route/Route.php @@ -322,7 +322,7 @@ protected function _writeRoute() $names = $routeParams = []; $parsed = preg_quote($this->template, '#'); - if (strpos($route, '{') !== false) { + if (strpos($route, '{') !== false && strpos($route, '}') !== false) { preg_match_all('/\{([a-z0-9-_]+)\}/i', $route, $namedElements); $this->braceKeys = true; } else { diff --git a/tests/TestCase/Routing/Route/RouteTest.php b/tests/TestCase/Routing/Route/RouteTest.php index 2263a5dbf0d..e428da74fdb 100644 --- a/tests/TestCase/Routing/Route/RouteTest.php +++ b/tests/TestCase/Routing/Route/RouteTest.php @@ -190,6 +190,19 @@ public function testRouteCompileBraces() */ public function testRouteCompileMixedPlaceholders() { + $route = new Route( + '/images/{open/:id', + ['controller' => 'Images', 'action' => 'open'] + ); + $pattern = $route->compile(); + $this->assertRegExp($pattern, '/images/{open/9', 'Need both {} to enable brace mode'); + $result = $route->match([ + 'controller' => 'Images', + 'action' => 'open', + 'id' => 123, + ]); + $this->assertEquals('/images/{open/123', $result); + $route = new Route( '/fighters/{id}/move/{x}/:y', ['controller' => 'Fighters', 'action' => 'move'],