Я писал, что в Эгее было сделано несколько важных изменений на системном уровне; тогда я рассказал об отказе от реестра. Кривость внутреннего устройства не мешала Селекте (предыдущий релиз) быть лучшим движком блога, но мешала мне её развивать. Сегодня расскажу об урлах.
Раньше как было: все урлы были прописаны в файле .htaccess в виде инструкций мод_реврайта. Даже не буду показывать, на это было больно смотреть. Помимо, собственно, зависимости от мод_реврайта это создавало ещё кучу неудобств. Например, добавление новой страницы означало изменение хтакцесса. Поскольку у меня было автообновление, то движку приходилось править собственный хтакцесс, из-за чего к нему нужен был доступ на запись.
Теперь урлы разбирает сам движок; если реврайта нет, то в урле появляется ?go=, а остальная часть не меняется. Поэтому движку, во-первых, не нужен мод_реврайт, а во-вторых не нужно ничего менять в хтакцессе при добавлении новых страниц. Тут выяснилась приятная деталь: оказывается, мод_реврайт был единственным, что привязывало движок к Апачу; Эгея прекрасно работает и на nginx, и на lighttpd (на русском эти названия непередаваемы).
Разбор урла заключается в том, что любой урл преобразуется в название функции-обработчика, называемой candy (режим или служба в моей старой терминологии; сейчас ещё появились аджакс-обработчики как отдельный институт) и массив её параметров. Например, урл этой заметки /2011/04/25/1/ преобразуется вот во что:
$candy = 'e2m_note'
$parameters = array (
'year' = '2011',
'month' = '04',
'day' = '25',
'day-number' = '1',
)
Дальше специальный фильтр проверяет, залогинен ли пользователь, а если нет, то можно ли ему выполнять эту candy (смотреть на заметку можно всем, а вот редактировать — только мне, вот смотрите). Если можно, то e2m_note () вызывается для генерации контента страницы с массивом $parameters в качестве параметра. Сама она не интересуется урлом и просто собирает заметку по этим параметрам.
Урлогенератора не было вообще: ссылки писались прямым текстом или собирались из кусков как строки. Если урл чего-то изменялся, то потом можно было целый год обнаруживать глюки, связанные с тем, что в какой-то хитрой ситуации ссылка вела не туда. Сейчас есть функция e2_compose_url (), в которую передаётся candy и её параметры. Поэтому если функции генерации заметки нужно передать в шаблонизатор урлы тегов, то для каждого тега она делает так:
e2_compose_url ('e2m_tag', array ('tag-urlname' => $tagrec['URLName']))
На самом деле это означает «сгенерировать урл, переход по которому вызывал бы e2m_tag (array (’tag-urlname’ => $tagrec[’URLName’]))».
Итого, профит: независимость от мод_реврайта, Апача; гибкость в настройке урлов, независимость урлов от кода, который их обрабатывает; более высокая пуленепробиваемость кода. Когда-нибудь в следующей серии расскажу про шаблонизатор.