Browse Source

Proof of concept approach for Redirect exception.

Tests, docs and other requirements are coming soon.
Mark Story 10 years ago
parent
commit
6f6be2060e

+ 9 - 0
src/Routing/Exception/RedirectException.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace Cake\Routing\Exception;
+
+use RuntimeException;
+
+class RedirectException extends RuntimeException
+{
+}

+ 12 - 4
src/Routing/Filter/RoutingFilter.php

@@ -16,6 +16,7 @@ namespace Cake\Routing\Filter;
 
 use Cake\Event\Event;
 use Cake\Routing\DispatcherFilter;
+use Cake\Routing\Exception\RedirectException;
 use Cake\Routing\Router;
 
 /**
@@ -42,16 +43,23 @@ class RoutingFilter extends DispatcherFilter
      * If Routes have not been loaded they will be loaded, and config/routes.php will be run.
      *
      * @param \Cake\Event\Event $event containing the request, response and additional params
-     * @return void
+     * @return void|Cake\Network\Response A response will be returned when a redirect route is encountered.
      */
     public function beforeDispatch(Event $event)
     {
         $request = $event->data['request'];
         Router::setRequestInfo($request);
 
-        if (empty($request->params['controller'])) {
-            $params = Router::parse($request->url);
-            $request->addParams($params);
+        try {
+            if (empty($request->params['controller'])) {
+                $params = Router::parse($request->url);
+                $request->addParams($params);
+            }
+        } catch (RedirectException $e) {
+            $response = $event->data['response'];
+            $response->statusCode($e->getCode());
+            $response->header('Location', $e->getMessage());
+            return $response;
         }
     }
 }

+ 2 - 6
src/Routing/Route/RedirectRoute.php

@@ -15,6 +15,7 @@
 namespace Cake\Routing\Route;
 
 use Cake\Network\Response;
+use Cake\Routing\Exception\RedirectException;
 use Cake\Routing\Router;
 
 /**
@@ -91,12 +92,7 @@ class RedirectRoute extends Route
         if (isset($this->options['status']) && ($this->options['status'] >= 300 && $this->options['status'] < 400)) {
             $status = $this->options['status'];
         }
-        $this->response->header([
-            'Location' => Router::url($redirect, true)
-        ]);
-        $this->response->statusCode($status);
-        $this->response->send();
-        $this->response->stop();
+        throw new RedirectException(Router::url($redirect, true), $status);
     }
 
     /**