Skip to content

Commit

Permalink
Merge pull request #2712 from pveyes/develop
Browse files Browse the repository at this point in the history
Enable HTTP Verb in Routing
  • Loading branch information
narfbg committed Nov 11, 2013
2 parents 0949b36 + 0b58b3c commit af709d6
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 2 deletions.
31 changes: 29 additions & 2 deletions system/core/Router.php
Original file line number Diff line number Diff line change
Expand Up @@ -345,15 +345,42 @@ protected function _parse_routes()
// Turn the segment array into a URI string
$uri = implode('/', $this->uri->segments);

// Get HTTP verb
$http_verb = strtolower($_SERVER['REQUEST_METHOD']);

// Is there a literal match? If so we're done
if (isset($this->routes[$uri]) && is_string($this->routes[$uri]))
if (isset($this->routes[$uri]))
{
return $this->_set_request(explode('/', $this->routes[$uri]));
// Check default routes format
if (is_string($this->routes[$uri]))
{
return $this->_set_request(explode('/', $this->routes[$uri]));
}
// Is there any matching http verb?
elseif (is_array($this->routes[$uri]) && isset($this->routes[$uri][$http_verb]))
{
return $this->_set_request(explode('/', $this->routes[$uri][$http_verb]));
}
}

// Loop through the route array looking for wildcards
foreach ($this->routes as $key => $val)
{
// Check if route format is using http verb
if (is_array($val))
{
// Does the http verb match?
if (isset($val[$http_verb]))
{
$val = $val[$http_verb];
}
// No match, skip to next rule
else
{
continue;
}
}

// Convert wildcards to RegEx
$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);

Expand Down
1 change: 1 addition & 0 deletions user_guide_src/source/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@ Release Date: Not Released

- :doc:`URI Routing <general/routing>` changes include:

- Added possibility to route requests using HTTP Verb
- Added possibility to route requests using callbacks.
- Added a new reserved route (*translate_uri_dashes*) to allow usage of dashes in the controller and method URI segments.
- Deprecated methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` in favor of their respective public properties.
Expand Down
36 changes: 36 additions & 0 deletions user_guide_src/source/general/routing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,42 @@ routing rules to process the back-references. Example::
return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};

Using HTTP Verb in Routes
=========================

If you prefer you can use HTTP Verb (or method) to define your routing rules.
This is particularly useful when building RESTful application. You can use standard HTTP
Verb (GET, PUT, POST, DELETE) or custom HTTP Verb (e.g: PURGE). HTTP Verb rule is case
insensitive. All you need to do is add array index using HTTP Verb rule. Example::

$route['products']['put'] = 'product/insert';

In the above example, a PUT request to URI "products" would call the "product" controller
class and "insert" method

::

$route['products/(:num)']['DELETE'] = 'product/delete/$1';

A DELETE request to URL with "products" as first segment and a number in the second will be
remapped to the "product" class and "delete" method passing in the match as a variable to
the method.

::

$route['products/([a-z]+)/(\d+)']['get'] = 'product/$1/$2';

A GET request to a URI similar to products/shirts/123 would call the "product" controller
class and "shirt" method with number as method parameter

Using HTTP Verb is optional, so if you want any HTTP Verb to be handled in one rule
You could just write your routing rule without HTTP Verb. Example::

$route['product'] = 'product';

This way, all incoming request using any HTTP method containing the word "product"
in the first segment will be remapped to "product" class

Reserved Routes
===============

Expand Down

0 comments on commit af709d6

Please sign in to comment.