Example #1
0
 /**
  * Router setup routine. Automatically called during Kohana setup process.
  *
  * @return  void
  */
 public static function setup()
 {
     if (!empty($_SERVER['QUERY_STRING'])) {
         // Set the query string to the current query string
         self::$query_string = '?' . trim($_SERVER['QUERY_STRING'], '&/');
     }
     if (self::$routes === NULL) {
         // Load routes
         self::$routes = Kohana::config('routes');
     }
     // Default route status
     $default_route = FALSE;
     if (self::$current_uri === '') {
         // Make sure the default route is set
         if (!isset(self::$routes['_default'])) {
             throw new Kohana_Exception('core.no_default_route');
         }
         // Use the default route when no segments exist
         self::$current_uri = self::$routes['_default'];
         // Default route is in use
         $default_route = TRUE;
     }
     // Make sure the URL is not tainted with HTML characters
     self::$current_uri = html::specialchars(self::$current_uri, FALSE);
     // Remove all dot-paths from the URI, they are not valid
     self::$current_uri = preg_replace('#\\.[\\s./]*/#', '', self::$current_uri);
     // At this point segments, rsegments, and current URI are all the same
     self::$segments = self::$rsegments = self::$current_uri = trim(self::$current_uri, '/');
     // Set the complete URI
     self::$complete_uri = self::$current_uri . self::$query_string;
     // Explode the segments by slashes
     self::$segments = ($default_route === TRUE or self::$segments === '') ? array() : explode('/', self::$segments);
     if ($default_route === FALSE and count(self::$routes) > 1) {
         // Custom routing
         self::$rsegments = self::routed_uri(self::$current_uri);
     }
     // The routed URI is now complete
     self::$routed_uri = self::$rsegments;
     // Routed segments will never be empty
     self::$rsegments = explode('/', self::$rsegments);
     // Prepare to find the controller
     $controller_path = '';
     $method_segment = NULL;
     // Paths to search
     $paths = Kohana::include_paths();
     foreach (self::$rsegments as $key => $segment) {
         // Add the segment to the search path
         $controller_path .= $segment;
         $found = FALSE;
         foreach ($paths as $dir) {
             // Search within controllers only
             $dir .= 'controllers/';
             if (is_dir($dir . $controller_path) or is_file($dir . $controller_path . EXT)) {
                 // Valid path
                 $found = TRUE;
                 // The controller must be a file that exists with the search path
                 if ($c = str_replace('\\', '/', realpath($dir . $controller_path . EXT)) and is_file($c) and strpos($c, $dir) === 0) {
                     // Set controller name
                     self::$controller = $segment;
                     // Change controller path
                     self::$controller_path = $c;
                     // Set the method segment
                     $method_segment = $key + 1;
                     // Stop searching
                     break;
                 }
             }
         }
         if ($found === FALSE) {
             // Maximum depth has been reached, stop searching
             break;
         }
         // Add another slash
         $controller_path .= '/';
     }
     if ($method_segment !== NULL and isset(self::$rsegments[$method_segment])) {
         // Set method
         self::$method = self::$rsegments[$method_segment];
         if (isset(self::$rsegments[$method_segment + 1])) {
             // Set arguments
             self::$arguments = array_slice(self::$rsegments, $method_segment + 1);
         }
     }
     // Last chance to set routing before a 404 is triggered
     Event::run('system.post_routing');
     if (self::$controller === NULL) {
         // No controller was found, so no page can be rendered
         Event::run('system.404');
     }
 }
Example #2
0
 /**
  * Attempts to determine the current URI using CLI, GET, PATH_INFO, ORIG_PATH_INFO, or PHP_SELF.
  *
  * @return  void
  */
 public static function find_uri()
 {
     if (PHP_SAPI === 'cli') {
         // Command line requires a bit of hacking
         if (isset($_SERVER['argv'][1])) {
             self::$current_uri = $_SERVER['argv'][1];
             // Remove GET string from segments
             if (($query = strpos(self::$current_uri, '?')) !== FALSE) {
                 list(self::$current_uri, $query) = explode('?', self::$current_uri, 2);
                 // Parse the query string into $_GET
                 parse_str($query, $_GET);
                 // Convert $_GET to UTF-8
                 $_GET = utf8::clean($_GET);
             }
         }
     } elseif (isset($_GET['Eight_uri'])) {
         // Use the URI defined in the query string
         self::$current_uri = $_GET['Eight_uri'];
         // Remove the URI from $_GET
         unset($_GET['Eight_uri']);
         // Remove the URI from $_SERVER['QUERY_STRING']
         $_SERVER['QUERY_STRING'] = preg_replace('~\\bEight_uri\\b[^&]*+&?~', '', $_SERVER['QUERY_STRING']);
         // Fixes really strange handling of a suffix in a GET string
         if ($suffix = Eight::config('core.url_suffix') and substr(self::$current_uri, -strlen($suffix)) === '_' . substr($suffix, 1)) {
             self::$current_uri = substr(self::$current_uri, 0, -strlen($suffix));
         }
     } elseif (isset($_SERVER['PATH_INFO']) and $_SERVER['PATH_INFO']) {
         self::$current_uri = $_SERVER['PATH_INFO'];
     } elseif (isset($_SERVER['ORIG_PATH_INFO']) and $_SERVER['ORIG_PATH_INFO']) {
         self::$current_uri = $_SERVER['ORIG_PATH_INFO'];
     } elseif (isset($_SERVER['PHP_SELF']) and $_SERVER['PHP_SELF']) {
         self::$current_uri = $_SERVER['PHP_SELF'];
     }
     // The front controller directory and filename
     $fc = substr(realpath($_SERVER['SCRIPT_FILENAME']), strlen(DOCROOT));
     if (($strpos_fc = strpos(self::$current_uri, $fc)) !== FALSE) {
         // Remove the front controller from the current URI
         self::$current_uri = substr(self::$current_uri, $strpos_fc + strlen($fc));
     }
     // Remove all dot-paths from the URI, they are not valid
     self::$current_uri = preg_replace('#\\.[\\s./]*/#', '', self::$current_uri);
     // Reduce multiple slashes into single slashes, remove trailing slashes
     self::$current_uri = trim(preg_replace('#//+#', '/', self::$current_uri), '/');
     // Make sure the URL is not tainted with HTML characters
     self::$current_uri = html::specialchars(self::$current_uri, FALSE);
     if (!empty($_SERVER['QUERY_STRING'])) {
         // Set the query string to the current query string
         self::$query_string = '?' . trim($_SERVER['QUERY_STRING'], '&');
     }
 }