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