mirror of https://github.com/flightphp/core
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							109 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							109 lines
						
					
					
						
							2.3 KiB
						
					
					
				<?php
 | 
						|
/**
 | 
						|
 * Flight: An extensible micro-framework.
 | 
						|
 *
 | 
						|
 * @copyright   Copyright (c) 2011, Mike Cao <mike@mikecao.com>
 | 
						|
 * @license     MIT, http://flightphp.com/license
 | 
						|
 */
 | 
						|
 | 
						|
namespace flight\net;
 | 
						|
 | 
						|
/**
 | 
						|
 * The Router class is responsible for routing an HTTP request to
 | 
						|
 * an assigned callback function. The Router tries to match the
 | 
						|
 * requested URL against a series of URL patterns. 
 | 
						|
 */
 | 
						|
class Router {
 | 
						|
    /**
 | 
						|
     * Mapped routes.
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $routes = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Pointer to current route
 | 
						|
     *
 | 
						|
     * @var int
 | 
						|
     */
 | 
						|
    protected $index = 0;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets mapped routes.
 | 
						|
     *
 | 
						|
     * @return array Array of routes
 | 
						|
     */
 | 
						|
    public function getRoutes() {
 | 
						|
        return $this->routes;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Clears all routes the router.
 | 
						|
     */
 | 
						|
    public function clear() {
 | 
						|
        $this->routes = array();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Maps a URL pattern to a callback function.
 | 
						|
     *
 | 
						|
     * @param string $pattern URL pattern to match
 | 
						|
     * @param callback $callback Callback function
 | 
						|
     */
 | 
						|
    public function map($pattern, $callback) {
 | 
						|
        if (strpos($pattern, ' ') !== false) {
 | 
						|
            list($method, $url) = explode(' ', trim($pattern), 2);
 | 
						|
 | 
						|
            $methods = explode('|', $method);
 | 
						|
 | 
						|
            array_push($this->routes, new Route($url, $callback, $methods));
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            array_push($this->routes, new Route($pattern, $callback, array('*')));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Routes the current request.
 | 
						|
     *
 | 
						|
     * @param Request $request Request object
 | 
						|
     * @return Route Matching route
 | 
						|
     */
 | 
						|
    public function route(Request $request) {
 | 
						|
        while ($route = $this->current()) {
 | 
						|
            if ($route !== false && $route->matchMethod($request->method) && $route->matchUrl($request->url)) {
 | 
						|
                return $route;
 | 
						|
            }
 | 
						|
            $this->next();
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the current route.
 | 
						|
     *
 | 
						|
     * @return Route
 | 
						|
     */
 | 
						|
    public function current() {
 | 
						|
        return isset($this->routes[$this->index]) ? $this->routes[$this->index] : false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the next route.
 | 
						|
     *
 | 
						|
     * @return Route
 | 
						|
     */
 | 
						|
    public function next() {
 | 
						|
        $this->index++;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Reset to the first route.
 | 
						|
     */
 | 
						|
    public  function reset() {
 | 
						|
        $this->index = 0;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |