покртитикуйте реализацию обработки ЧПУ

Духовность™

Продвинутый новичок
покртитикуйте реализацию обработки ЧПУ

Никогда ЧПУ не делал на уровне разбора непосредственно в скрипте. Сейчас уже подошел к этому вплотную. Вот что придумал.

В хтацесс:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?path=/$1&%{QUERY_STRING} [L]

В PHP:

PHP:
// Соответствие алиас-обрабатывающий скрипт
$_CONFIG['aliases'] = array
(
    '~/index~' => 'index',
    // regdata.php на самом деле ничего о виртуальной директории /user/ не знает!
    '~/user/regdata/?~i' => 'regdata',
    '~/user/getpassword/?~i' => 'getpassword',
    '~/articles/([a-z0-9_\-]+)/~i' => 'articles_rubric',
    '~/articles/([a-z0-9_\-]+)/([a-z0-9_\-]+)\.html~i' => 'article',
);

if (empty($_REQUEST["path"]))
{
    $_REQUEST["path"] = '/index';
}

foreach ($_CONFIG['aliases'] as $regexp => $mod)
{
    if (preg_match($regexp, $_REQUEST["path"], $matches))
    {
        $module = $mod;
        print_r($matches); // параметры для модуля
    }
}

echo $module; // имя модуля
include($module.'.php'); // подгружаем модуль
покритикуйте чтоли...
 

kruglov

Новичок
Дня первого раза сойдет.

Вы уверены, что собираетесь игнорировать регистр символов в URI?

А толку заводить переменную path, если в $_SERVER['REQUEST_URI'] и так все лежать будет?
 

Alexandre

PHPПенсионер
сам делаю почти как предложил triumvirat
1) все запросы закручиваю на index.php
2) разбираю explode( '/', $_SERVER['REQUEST_URI'] )
3) контроллером выбираю по первому элемента массива соответствующий класс обработки и инклужу его
4) имлементирую класс запрашиваемой страницы и передаю ему в качестве параметров: конфиг данные, разобраный путь
5) выполняю метод $page->execute()
 

Духовность™

Продвинутый новичок
Вы уверены, что собираетесь игнорировать регистр символов в URI?
хорошее замечание, спасибо


имлементирую класс запрашиваемой страницы
что такое "запрашиваемая страница"? модуль?

Дня первого раза сойдет.
да вот собственно не хочется делать как "в первый раз". хочется реализовать качественно и нормально...

Очень часто вижу, как CMS настраивают на показ индивидуальных урлов. С этим в принципе проблем нет, достаточно хранить соответствие алиас-модуь в БД. Но вот создать URL вложенный, подобного типа:

/php/php5/classes/interfaces

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

fixxxer

К.О.
Партнер клуба
например - на уровне контроллера по префиксу скажем определяешь обработчик, остальное передаешь ему параметрами и там уже разгребаешь.
если выпендриваться то можно цепочку сделать.
 

Духовность™

Продвинутый новичок
по префиксу скажем определяешь обработчик
все равно не понимаю. ну распарсю я /php/php5/classes/interfaces
получу php
определю что это модуль "мануал".
дальше идет php5 - что мне с ним делать? как это интерпретировать?
 

Nelius

кипарис во дворе
определю что это модуль "мануал".
дальше идет php5 - что мне с ним делать? как это интерпретировать?
А разве это не зависит от структуры модуля "мануал"? Мож модуль мануал и должен знать что с этим делать?
 

HraKK

Мудак
Команда форума
ага, у нас цепочка роутеров и респонс обьектом)
 

Nelius

кипарис во дворе
HraKK
Да, да алгоритм в студию, интересно жутко :) Пожааалуйста :D
 

HraKK

Мудак
Команда форума
а что тут показывать ? букаффки?
берете главный роутер который разруливает основное - у нас
это движок и язык и ищет по первому совпадению модуль.
не найдя отдает в дефолтный модуль, который создает респонс обьект и добавляю туда например каталог, публикации и страницы. отдаю им дальше управление. те уже смотрят по своей структуре подходит им этот запрос или нет - если подошел - все отдается ему управление.
это так в кратце :)
 

zerkms

TDD infected
Команда форума
4) имлементирую класс запрашиваемой страницы и передаю ему в качестве параметров: конфиг данные, разобраный путь
феерическая фраза :))))
 

crocodile2u

http://vbolshov.org.ru
А я вот по старинке: для каждого случая - отдельное правило rewrite :)
И не жужжу.
 
Сверху