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;
 | |
|     }
 | |
| }
 | |
| 
 |