Browse Source

Merge pull request #15396 from cakephp/route-element-placeholder

Use new braced route element placeholders in resource paths.
Mark Story 5 years ago
parent
commit
ac8dcc833a
2 changed files with 16 additions and 11 deletions
  1. 9 4
      src/Routing/RouteBuilder.php
  2. 7 7
      tests/TestCase/Routing/RouteBuilderTest.php

+ 9 - 4
src/Routing/RouteBuilder.php

@@ -56,9 +56,9 @@ class RouteBuilder
     protected static $_resourceMap = [
         'index' => ['action' => 'index', 'method' => 'GET', 'path' => ''],
         'create' => ['action' => 'add', 'method' => 'POST', 'path' => ''],
-        'view' => ['action' => 'view', 'method' => 'GET', 'path' => ':id'],
-        'update' => ['action' => 'edit', 'method' => ['PUT', 'PATCH'], 'path' => ':id'],
-        'delete' => ['action' => 'delete', 'method' => 'DELETE', 'path' => ':id'],
+        'view' => ['action' => 'view', 'method' => 'GET', 'path' => '{id}'],
+        'update' => ['action' => 'edit', 'method' => ['PUT', 'PATCH'], 'path' => '{id}'],
+        'delete' => ['action' => 'delete', 'method' => 'DELETE', 'path' => '{id}'],
     ];
 
     /**
@@ -215,6 +215,11 @@ class RouteBuilder
      */
     public function path(): string
     {
+        $routeKey = strpos($this->_path, '{');
+        if ($routeKey !== false && strpos($this->_path, '}') !== false) {
+            return substr($this->_path, 0, $routeKey);
+        }
+
         $routeKey = strpos($this->_path, ':');
         if ($routeKey !== false) {
             return substr($this->_path, 0, $routeKey);
@@ -421,7 +426,7 @@ class RouteBuilder
 
         if ($callback !== null) {
             $idName = Inflector::singularize(Inflector::underscore($name)) . '_id';
-            $path = '/' . $options['path'] . '/:' . $idName;
+            $path = '/' . $options['path'] . '/{' . $idName . '}';
             $this->scope($path, [], $callback);
         }
 

+ 7 - 7
tests/TestCase/Routing/RouteBuilderTest.php

@@ -598,9 +598,9 @@ class RouteBuilderTest extends TestCase
         $all = $this->collection->routes();
         $this->assertSame('Articles', $all[8]->defaults['controller']);
         $this->assertSame('/api/posts', $all[8]->template);
-        $this->assertSame('/api/posts/:id', $all[1]->template);
+        $this->assertSame('/api/posts/{id}', $all[1]->template);
         $this->assertSame(
-            '/api/posts/:article_id/comments',
+            '/api/posts/{article_id}/comments',
             $all[4]->template,
             'parameter name should reflect resource name'
         );
@@ -680,8 +680,8 @@ class RouteBuilderTest extends TestCase
         $this->assertCount(10, $all);
 
         $this->assertSame('/api/network-objects', $all[8]->template);
-        $this->assertSame('/api/network-objects/:id', $all[2]->template);
-        $this->assertSame('/api/network-objects/:network_object_id/attributes', $all[4]->template);
+        $this->assertSame('/api/network-objects/{id}', $all[2]->template);
+        $this->assertSame('/api/network-objects/{network_object_id}/attributes', $all[4]->template);
     }
 
     /**
@@ -843,7 +843,7 @@ class RouteBuilderTest extends TestCase
         $this->assertSame('index', $result[1]->defaults['action']);
         $this->assertSame('GET', $result[1]->defaults['_method']);
 
-        $this->assertSame('/articles/:id', $result[0]->template);
+        $this->assertSame('/articles/{id}', $result[0]->template);
         $this->assertSame('delete', $result[0]->defaults['action']);
         $this->assertSame('DELETE', $result[0]->defaults['_method']);
     }
@@ -866,7 +866,7 @@ class RouteBuilderTest extends TestCase
         $this->assertSame('/articles', $result[1]->template);
         $this->assertSame('showList', $result[1]->defaults['action']);
 
-        $this->assertSame('/articles/:id', $result[0]->template);
+        $this->assertSame('/articles/{id}', $result[0]->template);
         $this->assertSame('delete', $result[0]->defaults['action']);
     }
 
@@ -884,7 +884,7 @@ class RouteBuilderTest extends TestCase
 
             $routes->resources('Comments');
             $route = $this->collection->routes()[3];
-            $this->assertSame('/api/articles/:article_id/comments', $route->template);
+            $this->assertSame('/api/articles/{article_id}/comments', $route->template);
         });
     }