PHP « Роутинг на PHP

Здравствуйте.
Решил создать (или как правильно сказать ;/) свой URI роутинг на PHP. Но не понимаю алгоритма (дурак потому что).
К примеру хочу обрабатывать URI типа /** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

index.php?module=some&seg=segment&id=2
 

как
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

index.php/some/segment/2
 

Если неправильно излагаюсь, прошу поправить. :)
P.S. Может быть это делается методом обработки QUERY_STRING'а?
UPD: не Mod_Rewrite'ом.

1 ответов


Во первых, у вас путаница в том что вы написали
исходный урл у вас такой

index.php/some/segment/2

Вот это:
index.php?module=some&seg=segment&id=2
существует только у больных на голову модреврайтом.

если разбирать урл с помощью php, то есть два варианта
1) все урлы начинаются с index.php/ - не самый лучший вариант, но зато без мод реврайта
2) урлы произвольные - нужно в mod_rewrite добавить правило


RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^.*$ index.php [L]
 

Тоесть если это не файл и не директория то тогда на индекс - тоесть все что генерится с помощью php проходит через индекс, а статика отдается так. Никаких php файлов кроме index.php больше быть не должно(ну в идеале)

А дальше примерно так

Router::run($_SERVER['REQUEST_URI']);
$data = explode('/', $requestUri);
 

из массива $data первым будет то что у вас модуль, вторым сегмент, потом id
Дальше уже разбираете как хотите и перенаправляете на контроллеры.
тут можете посмотреть реализацию роутера.

Егегей) возьми Zend_Controller_Router ))) Ты вроде Zend собирался изучать (если не прав, поправьте).

P.S. сейчас как раз хочу переписать его, может получится заставить работать чуть быстрее.


Для начала вам — так сказать, информация к размышлению:
файл .htaccess в корне сайта:


RewriteRule ^.*$ index.php [NC,L]
 
Эта инструкция передает все запросы на сайт файлу index.php. Соответственно, его код:

<?php
    // "ловим" строку запроса, превращаем её в масив
   $routeArray = explode('/', $_SERVER['REQUEST_URI']);
    // удаляем пустые элементы массива (элементы образованные начальным и конечным слэшами URI)
    // тут можно было обойтить array_shift и array_pop - но мне способ с foreach кажется более "универсальным"
    $route = array();
    foreach ($routeArray as $value) {
        if (!empty($value)) {
            $route[] = trim($value);
        }

    }
// вводим в адресную строку всякий бред, смотрим что нам показывают
echo "<pre>";
print_r($route);
echo "</pre>";
 Как именно ваши скрипты будут обрабатывать полученный массив данных — другой вопрос. "Классический" способ обработки в известных мне фреймворках: первый элемент массива — контроллер (или модуль), второй — action, последующие представляют собой пары ключ-значение.