2013-02-23 2 views
0

Мне нужно создать простой механизм маршрутизации, который принимает запрос типа:/foo/bar и переводит его в FooController-> barAction(); Я должен использовать один скрипт в качестве точки доступа для загрузки этих классов контроллеров и методов действий. Я также не могу использовать внешние фреймворки или библиотеки для выполнения этой задачи. Это должно быть выполнено на сервере PHP 5.3 с Apache.Простой проект маршрутизации PHP

Ниже то, что я написал уже, но у меня возникают проблемы при получении его на работу:

class Router { 

    private static $routes = array(); 

    private function __construct() {} 
    private function __clone() {} 

    public static function route($pattern, $callback) { 
     $pattern = '/' . str_replace('/', '\/', $pattern) . '/'; 
     self::$routes[$pattern] = $callback; 
    } 

    public static function execute() { 
     $url = $_SERVER['REQUEST_URI']; 
     $base = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])); 
     if (strpos($url, $base) === 0) { 
      $url = substr($url, strlen($base)); 
     } 
     foreach (self::$routes as $pattern => $callback) { 
      if (preg_match($pattern, $url, $params)) { 
       array_shift($params); 
       return call_user_func_array($callback, array_values($params)); 
      } 
     } 
    } 
} 

Я пытаюсь по крайней мере выполнить свой текущий сценарий, который базируется на другой простой маршрутизатор, но я не могу получить результат с использованием

Router::route('blog/(\w+)/(\d+)', function($category, $id){ 
    print $category . ':' . $id; 
}); 
Router::execute(); 
+5

Вы предоставили нам длинный список с требованиями и стеной кода, но забыли задать вопрос. – PeeHaa

+0

Я бы посмотрел на существующие проекты. Случайный пример: http://github.com/deceze/Kunststube-Router – deceze

+0

«Я также не могу использовать внешние фреймворки или библиотеки для выполнения этой задачи». но никто не запрещает вам смотреть на их исходный код. Использование библиотеки не просто перетаскивает черный ящик в приложение. И анализ кода - вот что делает программиста хорошим. – mpm

ответ

1

Вместо того, чтобы пытаться вырваться из ПУТЬ. Почему бы не использовать .htaccess.

Таким образом, вы могли бы иметь внутренний URL, который выглядит следующим образом:

index.php?module=MODULE&action=INDEX 

Затем с помощью .htaccess, чтобы обеспечить пути в URL и направлять их соответствующим образом.

www.mydomain.com/MODULE/INDEX 

Это сообщение может помочь с переписывания regex for creating pritty urls in htaccess

Там может быть лучше один, был просто быстрый поиск Google.

Таким образом, вы можете получить доступ к следующим образом:

$module = $_GET['module']; 
$action = $_GET['action]; 

Затем вы можете сделать проверку на соответствующие действия в маршрутизаторе, чтобы проверить, если он существует, а затем повторно маршрут соответствующим образом.

+0

Я не уверен, как бы перевести запрос URI хотя для FooController-> barAction() ;. Обычно я просто использую regex с .htaccess, чтобы делать красивые URL-адреса или перенаправлять. – user2102919

+0

Это решение не очень гибкое. Т.е., если вы хотите получить более глубокие URL-адреса в какой-то момент. Или вы хотите покончить с вышеуказанным соглашением по какой-либо причине (например, deeplinks)? – PeeHaa

+0

@PeeHaa Вы добавляете к нему больше, это был просто пример, чтобы заставить его задуматься о его решении, сделать его проще и не зависеть от разбора пути с регулярным выражением. Вот как это делается в большинстве фреймворков ... – iLLin

Смежные вопросы