Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable HTTP Verb in Routing #2712

Merged
merged 2 commits into from
Nov 11, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -420,6 +420,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