2011/02/01

Нано-роутер в одну строку, или ЧПУ на PHP за пять минут

RTFM!
//непереводимая игра идиоматических выражений

Давно обещал написать и показать. Сейчас выложу в одно известное место, и можете там посмотреть. Но если вы посмотрите, будет неинтересно читать. Как обычно случается с функциями подобных объемов, каментов в файле больше, чем кода =;)

Так вот, каждый пхпшник в своё время узнаёт три волшебные буквы "ЧПУ". Если мне не изменяет мой склероз, впервые в рунете их произнёс дядька Спектатор и вложил в них смысл "человекопонятный урл". Такие урлы удобно набирать ручками через слеш. Но не очень удобно подстраивать систему каталогов.
Настоящий пхпшник - существо ленивое и поэтому изобретает велосипеды не для того, чтобы кататься, а потому, что они красиво выглядят, просты в изобретении и ближе к телу. Как только мысль про ЧПУ внедряется в межушный нервный узел, тут же изобретается обработчик и кладётся в докрут. Задача обработчика элементарна: ловить урл и по табличке соответствий запускать метод из очередного Class Pager extends GodObject.

Постановка задачи, думаю, уже ясна. И функция, которая запускает колбек, как реакцию на шаблон, в пхп есть. Остальные двадцать девять строк кода это обвязка: сборка данных в массивы, обработка параметров и прочие хитрые штуки. Если ещё не открывали, предупреждаю: в коде присутствуют хаки и много си-стайла.
https://code.google.com/p/angry/source/browse/#svn%2Ftags%2Fnano.router%40ETC
Специальный нано-роутер, для тех кто не осилил большого красивого бота-обработчика потоковых команд. Функция выполняет примерно те же задачи - то есть, реагирует на подаваемые строки, но проще и без вкусных пост- и предобработчиков.

По сложившейся традиции, функция упрятана в "рамку", начинается с подчёркивания и занимает не больше двух экранов. Работает не просто, а очень просто. С вариативным количеством параметров.
Сначала набираются два массива: регулярок - которые мы юзаем в качестве фильтров, ведь ничего проще не придумаешь, а именованные плейсхолдеры, по здравому размышлению, оказывают не нужны; и колбеков - которые, собственно, и вызываются на попадание в регулярку. Специально для ленивцев сделан финт ушами про загрузку массивов и имен конфигурационных ini-файлов.
Затем, когда роутер вызывается с одним строковым параметром или без параметра, массивы всей пачкой скармливаются той самой волшебной, я бы даже сказал уникальной в своём роде, функции. Нашли? Правильно, это preg_replace($regexp_route_array, $callback_array, $URL);

У роутера есть несколько багофич, к которым можно привыкнуть или переделать: например, поменять порядок следования роутов и экшнов на обратый, чтобы добавленные позднее имели более высокий приоритет; или, например, доделать возврат из функции в строку только из отработавших роутов; или что ещё подсказывает вам фантазия.

на сегодня всё.
скоро выкачу те обрывки ::ETC, которые могут работать. подчёркиваю, всё, что есть по ::ETC, но без комментариев

Хорошая, кстати, идея со словом "нано"; я и так слил все хелперы, функции и фильтры в один каталог, теперь переименую - и будут наниты вместо хелперов.
Оставайтесь с нами =;)

зы: в роутере трёхэтажный мат с call_user_func и explode\implode это своеобразная защита от совсем дурака и такое нужное обкавычивание, которое легко забывается особенно в ини-шках.

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