TUrlmap это класс который сопоставляет адреса (url) и классы блоголёта и занимается непосредственной отдачей контента. Все адреса(url) в блоголёте заранее известны и находятся в TUrlmap. Чтобы понять как TUrlmap хранит адреса, представим себе ассоциативный массив, где индексы - это адреса, а элементы это информация о странице. Но поскольку подобная плоская модель имеет очевидные ограничения, в настоящее время в TUrlmap имеются три подобных массива: первый как описано, второй - тоже самое, но только страницы из этого списка могут принимать параметры get, и третий - это дерево. Например адреса записей хранятся в первом массиве - адреса постов не имеют параметров get и на попытку к адресу поста что нибудь добавить приведет к ошибке 404 - не найдено. Для добавления такого адреса в TUrlmap есть метод

public function Add($url, $class, $arg)

где соответственно $url - адрес добавляемой страницы, $class - имя класса, который будет генерировать контент, и $arg - параметры, которые TUrlmap передает для класса, например для поста (TPost) это будет ID поста.

Если же страница обрабатывает параметры get то ее следует добавить другим методом:

public function AddGet($url, $class, $arg)

где параметры полностью аналогичны, однако $url должен быть до вопросительного знака - ?.Если TUrlmap не найдет адрес в первом массиве адресов, то он начнет поиск среди адресов с get, предварительно убрав из адреса все символы после ?. Удобство первого массива адресов заключается еще в том, что в него можно добавлять адреса любого вида с любыми символами -, в том числе в адресе параметры get и длинные пути к папкам.

Следующим этапом поиска класса для страницы будет разбор адреса по папкам и проход по дереву. То есть сопоставляется урл с путем как в файловой системе. Для этого TUrlmap имеет дерево адресов. урлы для дерева приходят уже без параметров get - до этого были две проверки. Сейчас в блоголёте в виде дерева организованы ссылки на RSS комментариев и админка. Адреса RSS комментариев выглядят следующим образом /comments/2/ где 2 - это ID поста. А для админки все адреса начинаются с /admin/ Чтобы добавить в дерево узел верхнего уровня используется метод

public function AddNode($url, $class, $arg)

что полностью соответствует выше описанному. Чтобы добавить подузел к узлу верхнего уровня есть метод

public function AddSubNode($nodeurl, $url, $class, $arg)

где $nodeurl - урл верхнего узла, для админки это будет 'admin'.

После того как TUrlmap нашел класс для урла, проверяется кеш - если в кеше есть страница и она еще не состарилась, то она исполняется через функцию php include - на странице может быть исполняемый каждый раз php код. Если в кеше нет или страница состарилась, то TUrlmap создает объект этого класса и вызывает, если существует, метод класса

public function Request($args)

как правило этот метод реализуется в классе, если отдается специфичный контент, например xml для RSS. если же особенного контента не получили от объекта, то создается объект класса TTemplate (он управляет шаблонами), который и генерирует html страницу, используя для контента запрошенный объект. Как же генерируется контент в TTemplate рассказывается на странице этого класса. После того, как TUrlmap получил контент от TTemplate он решает, что с ним делать: поместить ли в кеш и отдать в браузер. Если разрешен глобальный кеш и разрешено кеширование для этого объекта, то контент сохраняется в кеше.

Остается только упомянуть о событиях, которые есть в TUrlmap.

  • BeforeRequest - вызывается до поиска страницы
  • AfterRequest - вызывается уже после отдачи контента
  • CacheExpired - вызывается, когда кеш очищается

Для управления кешем есть несколько методов. ClearCache - полностью очищает кеш, удаляя все файлы из папки cache. SetExpired - только для одной единственной страницы очищает ее кеш.