Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.0

Search User Guide

# URI роутинг

В большинстве случаев используется соответствие один-к-одному между строкой URL и соответствующим методом и классом контроллера. Обычно сегменты URI соответствуют этому шаблону:

`example.com/class/`function`/id/`

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

К примеру, давайте предположим, что вы хотите, чтобы URL соответствовал этому прототипу:

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

Обычно второй сегмент URL зарезервирован за именем функции, но в примере выше он содержит идентификатор продукта. Чтобы решить это, CodeIgniter позволяет вам переписать обработчик URI.

## Установка ваших собственных правил

Правила роутинга определяются в файле application/config/routes.php. В нем вы найдете массив $route, который позволяет вам определить собственные критерии роутинга. Роуты могут быть определены посредством шаблонов или регулярных выражений

## Шаблоны

Обычные шаблоны выглядят примерно так:

`$route['product/(:num)'] = "catalog/product_lookup";`

В шаблоне ключи массива определяют совпадающий URI, а значения указывают на метод контроллер, который должен быть вызван. В примере выше, если слово "product" найдено в первом сегменте URI, и число во втором, будет загружен контроллер catalog и вызван его метод product_lookup.

Вы можете указывать литеральные значения, или использовать два типа шаблонов:

(:num) совпадет с сегментом, который содержит только цифры.
(:any) совпадет с сегментом, содержащим любой символ.

Примечание: Роуты работают в том порядке, в котором они определены. Вышестоящие роуты имеют преимущество над теми, которые определены ниже.

## Примеры

Вот несколько примеров роутинга:

`$route['journals'] = "blogs";`

URL, содержащий слово "journals" в первом параметре, будет перенаправлен в класс "blogs".

`$route['blog/joe'] = "blogs/users/34";`

URL, содержащий сегменты blog/joe, будет перенаправлен в класс "blogs" методу "users". Идентификатор будет установлен в "34".

`$route['product/(:any)'] = "catalog/product_lookup";`

URL, содержащий слово "product" в первом сегменте, и любое содержание во втором, будет перенаправлен в класс "catalog" и функцию "product_lookup".

`$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";`

URL со словом "product" в первом сегменте, и с номером во втором, будет перенаправлен в класс "catalog", и его методу "product_lookup_by_id" будет передана переменная из второго сегмента URI.

Важно: не используйте ведущие или завершающие слеши.

## Регулярные выражения

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

Примечание: Если вы используете обратные ссылки, вы должны применять синтаксис $ перед обратным слешем.

Типичный роут с использованем регулярных выражений может выглядеть так:

`$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";`

В этом примере URI, соответствующий products/shirts/123 вызовет контроллер shirts и функцию id_123.

Также вы можете смешивать шаблоны и регулярные выражения.

## Зарезервированные роуты

Есть два зарезервированных роута:

`$route['default_controller'] = 'welcome';`

Этот роут указывает, какой класс контроллера должен быть загружен, если URI не содержит данных, когда люди загружают корневой URL сайта. В примере выше будет загружен класс welcome. Вы должны всегда определять роут по умолчанию, иначе вместо главной страницы будет выводиться ошибка 404.

`$route['404_override'] = '';`

Этот роут определяет, какой контроллер должен использоваться, если запрашиваемый не найден. Он перепишет страницу 404 по умолчанию. Это не повлияет на функцию show_404(), которая будет загружать файл error_404.php, находящийся в application/errors/error_404.php.

Важно: Зарезервированные роуты должны определяться выше любого шаблона или регулярного выражения.

### Поделиться

Переведено в компании Аринт.

# Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

## Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter