summaryrefslogtreecommitdiffstats
path: root/application/core/MY_Router.php
blob: 2a20f579f4c2e55d769f50a921b6de120cb41b92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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);
    }
}