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

Как мы уже договорились наш класс 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: development, framework, mvc, oop, php, web engine