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.
Важно: Зарезервированные роуты должны определяться прежде (выше) остальных.