Browse Source

Make RouteBuilder::redirect() return route instances

Ian den Hartog 7 years ago
parent
commit
d755924c1a

+ 13 - 0
src/Routing/Route/RedirectRoute.php

@@ -108,4 +108,17 @@ class RedirectRoute extends Route
     {
         return false;
     }
+
+    /**
+     * Sets the HTTP status
+     *
+     * @param int $status The status code for this route
+     * @return $this
+     */
+    public function setStatus($status)
+    {
+        $this->options['status'] = $status;
+
+        return $this;
+    }
 }

+ 3 - 2
src/Routing/RouteBuilder.php

@@ -866,7 +866,7 @@ class RouteBuilder
      * @param array $options An array matching the named elements in the route to regular expressions which that
      *   element should match. Also contains additional parameters such as which routed parameters should be
      *   shifted into the passed arguments. As well as supplying patterns for routing parameters.
-     * @return void
+     * @return \Cake\Routing\Route\Route|\Cake\Routing\Route\RedirectRoute
      */
     public function redirect($route, $url, array $options = [])
     {
@@ -876,7 +876,8 @@ class RouteBuilder
         if (is_string($url)) {
             $url = ['redirect' => $url];
         }
-        $this->connect($route, $url, $options);
+
+        return $this->connect($route, $url, $options);
     }
 
     /**

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

@@ -236,4 +236,17 @@ class RedirectRouteTest extends TestCase
         $route = new RedirectRoute('/:lang/my_controllers', ['controller' => 'tags', 'action' => 'add'], ['lang' => '(nl|en)', 'persist' => ['lang']]);
         $route->parse('/nl/my_controllers/');
     }
+
+    /**
+     * Test setting HTTP status
+     *
+     * @return void
+     */
+    public function testSetStatus()
+    {
+        $route = new RedirectRoute('/home', ['controller' => 'posts']);
+        $result = $route->setStatus(302);
+        $this->assertSame($result, $route, 'Should return this');
+        $this->assertEquals(302, $route->options['status']);
+    }
 }

+ 4 - 0
tests/TestCase/Routing/RouteBuilderTest.php

@@ -428,6 +428,10 @@ class RouteBuilderTest extends TestCase
 
         $this->assertInstanceOf(RedirectRoute::class, $route);
         $this->assertEquals('/forums', $route->redirect[0]);
+
+        $route = $routes->redirect('/old', '/forums');
+        $this->assertInstanceOf(RedirectRoute::class, $route);
+        $this->assertSame($route, $this->collection->routes()[2]);
     }
 
     /**