Browse Source

Check for both halves of the brace.

Only checking for one makes it possible to enter brace mode
accidentally.
Mark Story 8 years ago
parent
commit
f018dbfcc5
2 changed files with 14 additions and 1 deletions
  1. 1 1
      src/Routing/Route/Route.php
  2. 13 0
      tests/TestCase/Routing/Route/RouteTest.php

+ 1 - 1
src/Routing/Route/Route.php

@@ -322,7 +322,7 @@ class Route
         $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 {

+ 13 - 0
tests/TestCase/Routing/Route/RouteTest.php

@@ -191,6 +191,19 @@ class RouteTest extends TestCase
     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'],
             ['id' => '\d+', 'x' => '\d+', 'pass' => ['id', 'x']]