diff options
Diffstat (limited to 'application/core')
-rw-r--r-- | application/core/MY_Router.php | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/application/core/MY_Router.php b/application/core/MY_Router.php new file mode 100644 index 000000000..2a20f579f --- /dev/null +++ b/application/core/MY_Router.php @@ -0,0 +1,62 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); + +class MY_Router extends CI_Router { + /** + * This version of _parse_routes acts the same as the older version + * except that it now allows for callbacks to be used as an alternative + * to the original route styles. Backreferences are set to the + * parameters of the callback. Note: Remember to give default values to + * the parameters that can be empty. + */ + function _parse_routes() + { + // Turn the segment array into a URI string + $uri = implode('/', $this->uri->segments); + + // Is there a literal match? If so we're done + if (isset($this->routes[$uri])) + { + return $this->_set_request(explode('/', $this->routes[$uri])); + } + + // Loop through the route array looking for wild-cards + foreach ($this->routes as $key => $val) + { + // Convert wild-cards to RegEx + $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key)); + + // Does the RegEx match? + if (preg_match('#^'.$key.'$#', $uri)) + { + // Are we using a callback? + $callable = is_callable($val); + + // Determine the appropriate preg_replace to use. + $preg_replace_type = $callable? 'preg_replace_callback': 'preg_replace'; + + // Are we using callbacks to process the matches? + if($callable){ + $val = function($matches)use($val){ + // Remove the string we are matching against from the matches array. + array_shift($matches); + + // Distribute the matches to the arguments of the user's callback. + return call_user_func_array($val, $matches); + }; + } + + // Do we have a back-reference? + if ($callable OR (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)) + { + $val = call_user_func($preg_replace_type, '#^'.$key.'$#', $val, $uri); + } + + return $this->_set_request(explode('/', $val)); + } + } + + // If we got this far it means we didn't encounter a + // matching route so we'll set the site default route + $this->_set_request($this->uri->segments); + } +}
\ No newline at end of file |