From 442b50b0c78a8c630b139d3a9a30d3b731253565 Mon Sep 17 00:00:00 2001 From: Fatih Kalifa Date: Fri, 1 Nov 2013 02:44:56 +0700 Subject: Enable HTTP Verb in Routing Using array for HTTP Verb e.g: $route['(:any)']['POST'] = "controller/post_method"; $route['path']['GET'] = "controller/path_get_method"; $route['path']['(:any)'] = "controller/path_any_method"; Using (:any) or not will make same result e.g: $route['path']['(:any)'] == $route['path'] So it won't break existing route --- system/core/Router.php | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'system') diff --git a/system/core/Router.php b/system/core/Router.php index 0f7278ae6..89d11afab 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -345,8 +345,20 @@ class CI_Router { // 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][$http_verb])) + { + return $this->_set_request(explode('/', $this->routes[$uri][$http_verb])); + } + else if (isset($this->routes[$uri]['(:any)'])) + { + return $this->_set_request(explode('/', $this->routes[$uri]['(:any)'])); + } + // Fallback to default routing + else if (isset($this->routes[$uri]) && is_string($this->routes[$uri])) { return $this->_set_request(explode('/', $this->routes[$uri])); } @@ -354,6 +366,25 @@ class CI_Router { // Loop through the route array looking for wildcards foreach ($this->routes as $key => $val) { + // Check if HTTP Verb is exist + if (is_array($val)) + { + // HTTP verb included in routes + if (isset($val[$http_verb])) + { + $val = $val[$http_verb]; + } + else if (isset($val['(:any)'])) + { + $val = $val['(:any)']; + } + else + { + // HTTP Verb not found + continue; + } + } + // Convert wildcards to RegEx $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key); -- cgit v1.2.3-24-g4f1b From 0b58b3cad456efc5ecce89f622876c6b715439c2 Mon Sep 17 00:00:00 2001 From: Fatih Kalifa Date: Tue, 5 Nov 2013 15:36:40 +0700 Subject: Fix HTTP Verb Routing Rules Fix code style, removed (:any) rule in http verb to avoid confusion, and add proposed documentation and changelog --- system/core/Router.php | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) (limited to 'system') diff --git a/system/core/Router.php b/system/core/Router.php index 89d11afab..9071f84b7 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -349,38 +349,34 @@ class CI_Router { $http_verb = strtolower($_SERVER['REQUEST_METHOD']); // Is there a literal match? If so we're done - if (isset($this->routes[$uri][$http_verb])) + if (isset($this->routes[$uri])) { - return $this->_set_request(explode('/', $this->routes[$uri][$http_verb])); - } - else if (isset($this->routes[$uri]['(:any)'])) - { - return $this->_set_request(explode('/', $this->routes[$uri]['(:any)'])); - } - // Fallback to default routing - else if (isset($this->routes[$uri]) && is_string($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 HTTP Verb is exist + // Check if route format is using http verb if (is_array($val)) { - // HTTP verb included in routes + // Does the http verb match? if (isset($val[$http_verb])) { $val = $val[$http_verb]; } - else if (isset($val['(:any)'])) - { - $val = $val['(:any)']; - } + // No match, skip to next rule else { - // HTTP Verb not found continue; } } -- cgit v1.2.3-24-g4f1b