Skip to content

Commit 6f6be20

Browse files
committed
Proof of concept approach for Redirect exception.
Tests, docs and other requirements are coming soon.
1 parent ad38687 commit 6f6be20

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Cake\Routing\Exception;
4+
5+
use RuntimeException;
6+
7+
class RedirectException extends RuntimeException
8+
{
9+
}

src/Routing/Filter/RoutingFilter.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
use Cake\Event\Event;
1818
use Cake\Routing\DispatcherFilter;
19+
use Cake\Routing\Exception\RedirectException;
1920
use Cake\Routing\Router;
2021

2122
/**
@@ -42,16 +43,23 @@ class RoutingFilter extends DispatcherFilter
4243
* If Routes have not been loaded they will be loaded, and config/routes.php will be run.
4344
*
4445
* @param \Cake\Event\Event $event containing the request, response and additional params
45-
* @return void
46+
* @return void|Cake\Network\Response A response will be returned when a redirect route is encountered.
4647
*/
4748
public function beforeDispatch(Event $event)
4849
{
4950
$request = $event->data['request'];
5051
Router::setRequestInfo($request);
5152

52-
if (empty($request->params['controller'])) {
53-
$params = Router::parse($request->url);
54-
$request->addParams($params);
53+
try {
54+
if (empty($request->params['controller'])) {
55+
$params = Router::parse($request->url);
56+
$request->addParams($params);
57+
}
58+
} catch (RedirectException $e) {
59+
$response = $event->data['response'];
60+
$response->statusCode($e->getCode());
61+
$response->header('Location', $e->getMessage());
62+
return $response;
5563
}
5664
}
5765
}

src/Routing/Route/RedirectRoute.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
namespace Cake\Routing\Route;
1616

1717
use Cake\Network\Response;
18+
use Cake\Routing\Exception\RedirectException;
1819
use Cake\Routing\Router;
1920

2021
/**
@@ -91,12 +92,7 @@ public function parse($url)
9192
if (isset($this->options['status']) && ($this->options['status'] >= 300 && $this->options['status'] < 400)) {
9293
$status = $this->options['status'];
9394
}
94-
$this->response->header([
95-
'Location' => Router::url($redirect, true)
96-
]);
97-
$this->response->statusCode($status);
98-
$this->response->send();
99-
$this->response->stop();
95+
throw new RedirectException(Router::url($redirect, true), $status);
10096
}
10197

10298
/**

0 commit comments

Comments
 (0)