November 29, 2009

Web Engine: Router

Router Итак, для начала создадим задачу Router под нужным проектом в системе управления проектами TaskUP и запустим эту задачу (про TaskUP будет отдельная статья). Начнем с простого, а именно с рутера — класса отвечающего за обработку URI. К тому же Router в движке, согласно нашей схемы, будет загружаться после конфигурации.

К конфигурации отдельно на будем уделять времени, а будем его касаться по мере надобности.

Класс должен уметь обрабатывать адреса следующего вида:
Типичный URL

Как мы уже договорились наш класс Engine будет состоять из статических методов, которые будут возвращать синглтон вспомогательных классов. Наш класс Router один из таких классов.

Файл Engine.php:

class Engine {

	protected static $_conf;
	protected static $_route;

	public static function conf(){
		if(self::$_conf===NULL){
			self::$_conf =  Array();
		}
		return self::$_conf;
	}

	public static function route(){
		if(self::$_route===NULL){
			self::loadClass('Router');
			self::$_route = new Router;
		}
		return self::$_route;
	}	

	public static function loadClass($class_name){
		require_once("lib/" ."$class_name"."_class.php");
	}
}

Как видим из файла в данном случае это статический метод route(). Внутри него подгружается класс Router.

Подгружаемый класс Router:

class Router {

	protected static $_URL;
	protected static $_N;
	protected static $_TAIL;

	function __construct(){
	  $uri = $_SERVER['REQUEST_URI'];

	  $uri = explode('/',$uri);
	  if(!$uri[0]) array_shift($uri);

	  foreach($uri as $id => $u){
	  	if(is_numeric($u)){
	  		self::$_N[]=$u;
	  	}elseif(!self::$_TAIL && !self::$_N){
	  		self::$_URL[]=$u;
	  	}else{
	  		self::$_TAIL[]=$u;
	  	}
	  }
	}

	public static function u($pos){
		return array_shift(array_slice(self::$_URL,$pos,1));
	}

	public static function n($pos){
		return array_shift(array_slice(self::$_N,$pos,1));
	}

	public static function t($pos){
		return array_shift(array_slice(self::$_TAIL,$pos,1));
	}
}

Переменные $_URL, $_N, $_TAIL защищены. В них складываются элементы адресной строки. Вспомогательные публичные методы u(), n() и t() дают доступ к этим переменным соответственно.

Пример использования:

public static function run(){
	self::route()->u(2); //  list 

	self::route()->n(0); // 49

	self::route()->t(-1); // desc
}

Конечно это не окончательное содержание этих файлов. Оно будет измяться и пополняться по мере наращивания функционала фреймфорка.


Tags: , , , , ,