CodeIgniter User Guide Version 2.0.0


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 зарезервирован именем функции, но в примере выше он соответствует ID продукта. Для преодоления этой зависимости, CodeIgniter позволяет вам изменить обработчик URI (remap the URI handler).

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

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

Шаблоны

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

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

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

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

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

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

Примеры

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

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

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

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

URL, содержащий сегмент blog/joe будет направлен в класс "blogs", метод "users". ID будет установлено в "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".

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

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

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

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

Типичный роут RegEx может быть похож на это:

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

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

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

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

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

Примечание переводчика. Очевидно, здесь опечатка — в предыдущих версиях CodeIgniter был зарезервированный роут для скаффолдинга, который упразднен в текущей версии. Так что остался только один зарезервированный роут. $route['default_controller'] = 'welcome';

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

Важно:  Зарезервированные роуты должны определяться прежде (выше) остальных.