Роутер

Роутер, это синглетон, основным назначением которого является разбор url, который запрашивает пользователь и запуск соответствующего экшена на исполнение.
Роутер является единственной точкой вхождения в приложение и только он определяет что сам движок и его плагины будут делать.

Первое с чего начинает свою работу роутер, это разбирает url на составляющие, а как он это делает покажу на примере разбора адреса страницы example.com/action/event/param1/param2/p0?p3&p4&p5)

Применение правил реврайта

Сначала анализируется часть сайта до его параметров — action/event/param1/param2/p0 – это путь контроллера. Этот путь состоит из двух частей – названия экшена (action) и определения ивента (event/param1/param2/p0). Параметров, указанных через слэш может быть сколько угодно много, но их комбинация в дальнейшем и позволит определить какой ивент будет запущен.
Такая структура адреса является дефолтной, хотя может быть и совершенно произвольной но с одним требованием – адрес который запрашивается должен быть приведен к такой структуре правилами реврайта адреса, которые указаны в конфиге в параметре $config['router']['uri']. Идея здесь простая: правила реврайта представляют собой массив, где ключ элемента это регулярное выражение, которое будет применяться к адресу запрашиваемой страницы, а значение элемента – итоговый адрес.
Например правило:
'~^\d{3}$~i' => 'profile/admin'

приведет к тому, что урла типа example.com/123, где вместо 123 могут быть любые цифры будет переводить на страницу профиля админа.
Так вот, перво-наперво путь контроллера подвергается реврайту по указанным правилам.

Определение экшена

Затем путь контроллера раскладывается на три составляющие: наименование экшена, в нашем случае (action), наименование ивента (event) и параметры ивента (param1/param2/p0) и по названию экшена определяется PHP-класс которому в дальнейшем перейдет управление. При определении класса есть некоторые особенности

1. Если экшен не указан (строка запроса пустая), то к выполнению будет назначен тот экшен, который указан в параметре $config['router']['config']['action_default'].
2. Затем имя класса ищется по секции конфига $config['router']['page'].
3. И если там не найдено и параметр автопоиска класса экшена включен ($config['router']['config']['autodefine']), то имя класса считается равным «ИмяэкшенаAction», и ищется в папке common/classes/actions и app/classes/actions.
4. Если и там не найден, то экшен ищется по плагинам.
5. Если же экшен не найден и в плагинах, то выполняется экшен ActionError, который выведет страницу 404-й ошибки.

Определение предыдущего url

Из куки с именем route_backward поднимается адрес предыдущей страницы и туда же записывается текущий адрес, что бы при перезагрузке страницы его можно было прочитать как предыдущий адрес.
Сам предыдущий адрес можно получить вызовом метода роутера:
$sData = Router:: Backward($sPart);

Здесь $sPart – строковый параметр, который определяет какая именно часть от предыдущего url будет возвращена. В нашем случае метод вернет следующие значение:
— Router::getInstance()->Backward(‘url’): вся ссылка;
— Router::getInstance()->Backward ('link'): ссылка без параметров – example.com/blog/event/param1/param2/p0;
— Router::getInstance()->Backward ('root'): адрес сайта — example.com/
— Router::getInstance()->Backward ('path'): адрес запрашиваемой страницы – /blog/event/param1/param2/p0
— Router::getInstance()->Backward ('action'): прошлый экшен – action;
— Router::getInstance()->Backward ('event'): прошлый ивент – event;
— Router::getInstance()->Backward ('params'): параметры прошлого ивента – param1/param2/p0.

Окончание работы роутера

Затем роутер запускает найденный экшен на исполнение.
В самом конце роутер выводит в шаблон переменные {$sAction}, {$sEvent}, {$aParams}, {$PATH_WEB_CURRENT} – это имя экшена, ивента, массив параметров ивента и текущий полный URL соответственно. Указанные переменные будут доступны в любом шаблоне, кроме шаблонов хуков.

Методы роутера

В классе роутера также реализованы статические методы для работы с адресом и переадресацией страниц, а именно:
1. Router:: Action($sAction, $sEvent, $aParams) – Функция переадресации на другой экшен;
2. Router:: GetPathWebCurrent() – Возвращает текущий url;
3. Router:: RealUrl($bPathOnly) – Возвращает реальный URL (или локальный путь на сайте) без реврайтов;
4. Router:: GetAction() – Возвращает текущий экшен;
5. Router:: GetActionEvent() – Возвращает текущий евент;
6. Router:: GetActionEventName() – Возвращает имя текущего евента;
7. Router:: GetActionClass() – Возвращает класс текущего экшена;
8. Router:: GetParams() – Возвращает параметры(те которые передаются в URL);
9. Router::GetControllerPath() – Возвращает текущий обрабатывемый путь контроллера;
10. Router:: SetParam() – Устанавливает значение параметра;
11. Router:: GetIsAjaxRequest() – Проверяет запрос послан как ajax или нет;
12. Router:: GetPath($sAction) – Возвращает правильную адресацию по переданому названию страницы (экшену);
13. Router:: Location($sLocation) – Выполняет редирект, предварительно завершая работу класса Engine;
14. Router:: Url($sPart) – Данные о текущем URL;
15. Router:: Backward($sPart) – Данные о предыдущем URL;
16. Router:: ReturnBack() – Возврат к предыдущему URL, отличие от GotoBack() анализирует переданные POST-параметры;
17. Router:: GetTopicUrlMask() – Возвращает маску формирования URL топика;

18. Router:: GetUserUrlMask() – Возвращает маску формирования URL профиля пользователя.

Основной термин: роутер
Синонимы: routing, роутером, роутера, роутере, router, роутеру, роутинг

Похожие статьи

  • Замена ЛСовскому Config::Set('router.page........')
    Здравсвуйте открыл свежую из гита версию Альто и возник вопрос по плагинам как сделать замена ЛСовскому Config::Set('router.page........') Смотрел плагин estheme нашел вот такую интересную строчку: /** *...

2 комментария

+1
Здесь наверно опечатка в параметре — в чем разница?

— Router::getInstance()->Backward(‘url’): вся ссылка;
— Router::getInstance()->Backward ('url'): параметры прошлого ивента – param1/param2/p0.
0
Да, действительно опечатка. В последнем случае должно быть Router::getInstance()->Backward ('params'), топик исправил, спасибо за замечание)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.