| Version 6 (modified by pingvein@…, 6 weeks ago) |
|---|
Роутинг
Table of Contents
В момент обращения пользоваталя к сайту движок должен произвести разбор запрашиваемого URL, определить какой экшен необходимо запустить и отправить его(экшен) на выполнение. Этим как раз и занимается роутинг, класс роутинга - /engine/classes/Router.class.php.
При запуске роутинг производит загрузку ядра через класс Engine (файл /engine/classes/Engine.class.php), происходит инициализация модулей, хуков и плагинов. Затем начинается разбор URL на составляющие.
Используется следующая структура URL: http://site.com/action/event/param0/param1/../paramN/?var1=value1&var2=value2 , где:
- action - имя экшена, который будет обрабатывать такой URL, соответствие именем экшена в URL и названием класса задается в конфиге роутинга.
- event - евент, который будет запускаться внутри экшена, определение евента можно назначать с помощью регулярного выражения
- paramN - дополнительные параметры переданные в URL
- varN - обычные GET параметры запроса
Далее запускается необходимый экшен, после его выполнения происходит завершения всех активных модулей и вывод результата в браузер.
Конфиг роутинга
Пример конфига:
$config['router']['page']['error'] = 'ActionError';
$config['router']['page']['blog'] = 'ActionBlog';
$config['router']['page']['index'] = 'ActionIndex';
// Глобальные настройки роутинга
$config['router']['config']['action_default'] = 'index';
$config['router']['config']['action_not_found'] = 'error';
Здесь первые три строчки устанавливает соответствия URL экшена и названию класса, который будет его обрабатывать. Например, для URL http://site.com/blog/ будет запускаться экшен ActionBlog.
Также необходимо назначить экшен, который будет запускаться по умолчанию, т.е. при заходе на URL http://site.com/. В нашем случаи это index и соответственно ActionIndex. Для этого используется параметр router.config.action_default.
И последнее, это назначение экшена, который будет запускаться при обращении к любой странице не описанной в конфиге роутера, т.е. запрос несуществующего URL. Например, http://site.com/blabla/. За это отвечает параметр router.config.action_not_found, в нашем случаи он имеет значение error.
Реврайты роутинга
Поддерживается два вида реврайтов:
- переопределение названия экшена
- создание псевдонима(alias) для определенного URL
Переопределение названия экшена
$config['router']['rewrite'] = array(
'blog' => 'forum',
);
В данном примере экшен blog заменяется на forum, т.е. URL http://site.com/blog/ перестанет работать, а вместо него заработает http://site.com/forum/.
Создание псевдонима
$config['router']['uri'] = array( '~^(\d+)\.html~i' => "blog/\\1.html", );
Здесь URL вида http://site.com/123.html будут эквивалентны http://site.com/blog/123.html, причем будут работать оба варианта.
Доступные методы Router
В классе роутера содержаться полезные статические методы:
- getInstance() - возвращает экземпляр объекта роутера
- Action($sAction,$sEvent=null,$aParams=null) - переадресует выполнение на новый экшен (внутренний реврайт). Для этого в текущем экшене необходимо возвратить этот метод, например, return Router::Action('error') запустит экшен error
- GetPathWebCurrent() - возвращает полный URL без GET параметров, например, для URL http://site.com/user/ort/?var=123 результат будет http://site.com/user/ort/
- GetAction() - возвращает текущий экшен, например, blog
- GetActionEvent() - возвращает текущий эвент, например, edit
- GetActionClass() - возвращает класс текущего экшена, например, ActionBlog
- SetActionEvent($sEvent) - устанавливает новый текущий эвент
- GetParams() - возвращает массив текущих параметров, которые были переданные через URL. Например, для http://site.com/user/ort/edit/fast/ вернет значение array('edit','fast')
- GetParam($iOffset,$def=null) - возвращает параметр по его номеру/смещению, $def определяет дефолтное значение в случаи если параметра не существует. Например, для http://site.com/user/ort/edit/fast/ Router::GetParam(0) вернет значение edit
- SetParam($iOffset,$value) - устанавливает значение параметра, например, Router::SetParam(0,'add')
- SetIsShowStats($bState) - устанавливает флаг показывать или нет статистику выполнения скрипта, например, Router::SetIsShowStats(false)
- GetIsShowStats() - возвращает флаг возможности отображения статистики выполнения скрипта
- GetPath($action) - возвращает полный URL до экшена, например, Router::GetPath('blog') вернет значение http://site.com/blog/
- Location($sLocation) - вызывает завершение всех активных модулей и выполняет переадресацию через header('Location: http://site.com/blabla/'); с 301 кодом HTTP (Moved Permanently). Например, Router::Location('http://google.com')
