Как стать автором
Обновить

Знакомство с Kohana 3.0 — Часть 6

Время на прочтение3 мин
Количество просмотров3.9K
Автор оригинала: http://www.dealtaker.com/blog/2010/03/03/kohana-php-3-0-ko3-tutorial-part-6/
Встречайте шестую часть цикла статей по разработке с Kohana PHP V3 (KO3). Предыдущие части можно найти по метке "знакомство с kohana 3.0". В этой части мы рассмотрим роутинг.

Роутинг – это, по сути, прием запроса, его анализ и перенаправление в нужное место. Что-то наподобие встроенного аналога файла .htaccess. Зачем может понадобиться роутинг, спросите вы? Причин может быть огромное множество, поэтому я лишь дам несколько примеров по настройке роутов для разных сценариев.

Как выглядит роут? Откройте файл “bootstrap.php” из папки “application/” и пролистайте до этого комментария:
/**
 * Set the routes. Each route must have a minimum of a name, a URI and a set of
 * defaults for the URI.
 */

Ниже должно быть что-то вроде:

Route::set('default', '(<controller>(/<action>(/<id>)))')
     ->defaults(array('controller' => 'welcome',
                      'action'     => 'index'));

То есть у нас уже есть предварительно настроенный роут. Давайте его разберем:
1. имя роута – “default”
2. ‘((/(/)))’ – скобки делают необязательным указание контроллера, экшена и id. А знаки <...> указывают, что данный параметр нужно присвоить переменной с именем, указанным в угловых скобках.
3. контроллер по умолчанию –“welcome”, а экшен по умолчанию – “index”.

Если перейти по адресу “http://localhost/mykohana3/”, роутер увидит, что мы не указали ни контроллер, ни экшен. Он насчет перебирать роуты на предмет совпадения. Поскольку у нас есть роут по умолчанию (“default”), роутер выберет его и добавит вместо пропущенного контроллера “welcome”, а вместо пропущенного экшена – “index”. То есть если ввести в браузере “http://localhost/mykohana3/”, то это будет аналогично “http://localhost/mykohana3/welcome/index”.

Если ввести адрес ”http://localhost/mykohana3/hmvc/”, то роутер заметит, что контроллер указан, а экшен – нет. Поэтому он вызовет “index”, который указан как экшен по умолчанию.

Помимо контроллера и экшена есть параметр “id”, который тоже является опциональным. Если мы перейдем по адресу “http://localhost/mykohana3/hmvc/index/111”, то не увидим ничего нового, поскольку мы не написали никакого обработчика этого параметра. Но если добавить второй параметр: “http://localhost/mykohana3/hmvc/index/111/222”, то мы получим ошибку. Это потому, что в нашем роуте прописаны лишь три сегмента (контроллер/экшен/id), а ”/222” является четвертым. Исправить это мы можем, приведя роут к следующему виду:

Route::set('default', '(<controller>(/<action>(/<id>(/<overflow>))))', array('overflow' => '.*?'))
     ->defaults(array('controller' => 'welcome',
                      'action'     => 'index'));

Если вы сохраните ‘bootstrap.php’ и обновите браузер, ошибка должна исчезнуть.

Мы добавили дополнительный массив “array(’overflow’ => ‘.*?’)”. Он назначает аргументу “overflow” регулярное выражение, тем самым говоря роутеру принимать всё, включая слеши, и передавать это контроллеру как переменную “overflow”. Так что после третьей секции роутер уже не будет принимать текст после каждого нового слеша за отдельный параметр.

Вернемся-ка к нашему аргументу “id”. Если мы собираемся использовать его как, например, цифровой идентификатор статьи, то стоит выдавать ошибку, если пользователь попытается передать что-то другое. Одним из способов решить эту проблему является создание (в нашем случае – изменение) роута:

Route::set('default', '(<controller>(/<action>(/<id>(/<overflow>))))', array('id' => '[[:digit:]]{1,}', 'overflow' => '.*?'))
     ->defaults(array('controller' => 'welcome',
                      'action'     => 'index'));

Если мы теперь откроем в браузере “http://localhost/mykohana3/hmvc/index/xxx”, то увидим ошибку о невозможности нахождения роута, которая по сути аналогична 404-й странице. Конечно, можно такую проверку устроить и внутри контроллера, это лишь пример возможного использования роутов.

Теперь давайте создадим свой роут, вместо изменения стандартного. В файл “bootstrap.php” добавьте перед ним следующее:

Route::set('monkeys', 'monkeys(/<action>(/<id>))')
     ->defaults(array('controller' => 'ko3',
                      'action'     => 'posts'));

Теперь при открытии страницы “http://localhost/mykohana3/monkeys” будет вызван экшен “posts” контроллера “ko3″. В списке секций слово “monkeys” не обрамлено круглыми скобками, что делает его не опциональным. Данный роут вызывается, когда роутер видит на месте контроллера слово “monkeys”.

Вот пример роута, который можно использовать для назначения статических страниц (позаимствовал его из Unofficial Kohana 3.0 Wiki):

Route::set('static', '<page>', array('page' => 'about|faq|locations'))
	   ->defaults(array('controller' => 'page',
                            'action'     => 'static'));

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

Примечание переводчика: на Хабре есть еще одна статья о роутинге в Kohana 3.0.
Теги:
Хабы:
Всего голосов 15: ↑7 и ↓8-1
Комментарии11

Публикации