Маршрутизация 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, который должен быть сопоставлен, а значение массива содержит пункт назначения, на который он должен быть перенаправлен. В приведенном выше примере, если в первом сегменте URL встречается слово «product», а во втором — число, вместо него используются класс «catalog» и метод «product_lookup».
Вы можете сопоставлять литеральные значения или использовать два типа подстановочных знаков:
(:num) будет соответствовать сегменту, содержащему только цифры. (:any) будет соответствовать сегменту, содержащему любой символ (кроме «/», который является разделителем сегментов).
Примечание
Подстановочные знаки на самом деле являются псевдонимами для регулярных выражений, где :any преобразуется в [^/]+, а :num — в [0-9]+.
Примечание
Правила маршрутизации будут выполняться в порядке их определения. Более поздние правила всегда имеют приоритет над более ранними.
Примечание
Правила маршрутизации не являются фильтрами! Установка правила, например, «foo/bar/(:num)», не предотвратит вызов контроллера Foo и метода bar с нечисловым значением, если это допустимый маршрут.
Примеры
Вот несколько примеров маршрутизации:
$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», передавая совпадение в качестве переменной в метод.
Важно
Не используйте ведущие/завершающие косые черты.
Регулярные выражения
Если вы предпочитаете, вы можете использовать регулярные выражения для определения правил маршрутизации. Допускаются любые допустимые регулярные выражения, а также обратные ссылки.
Примечание
Если вы используете обратные ссылки, вы должны использовать синтаксис с символом доллара, а не с двойным обратным слэшем.
Типичный маршрут RegEx может выглядеть так:
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
В приведенном выше примере URI, подобный products/shirts/123, вместо этого вызовет класс контроллера «shirts» и метод «id_123».
С помощью регулярных выражений вы также можете поймать сразу несколько сегментов. Например, если пользователь обращается к защищённой паролем области вашего веб-приложения, и вы хотите перенаправить его обратно на ту же страницу после входа в систему, вам может быть полезен этот пример:
$route['login/(.+)'] = 'auth/login/$1';
Примечание
В приведенном выше примере, если $1 содержит косую черту, она по-прежнему будет разделена на несколько параметров при передаче в Auth::login().
Для тех, кто не знаком с регулярными выражениями и хочет узнать больше, regular-expressions.info может быть хорошей отправной точкой.
Примечание
Вы также можете смешивать подстановочные знаки и регулярные выражения.
Обратные вызовы
Вы также можете использовать обратные вызовы вместо обычных правил маршрутизации для обработки обратных ссылок. Пример:
$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};
Использование HTTP-глаголов в маршрутах
Можно использовать HTTP-глаголы (метод запроса) для определения правил маршрутизации. Это особенно полезно при разработке RESTful приложений. Вы можете использовать стандартные HTTP-глаголы (GET, PUT, POST, DELETE, PATCH) или пользовательские (например, PURGE). Правила HTTP-глаголов не зависят от регистра. Всё, что вам нужно сделать, это добавить глагол в качестве ключа массива к вашему маршруту. Пример:
$route['products']['put'] = 'product/insert';
В приведенном выше примере, PUT-запрос к URI «products» вызовет метод контроллера Product::insert().
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
DELETE-запрос к URL с «products» в качестве первого сегмента и числом во втором будет сопоставлен с методом Product::delete(), передавая числовое значение в качестве первого параметра.
Использование HTTP-глаголов, конечно же, необязательно.
Зарезервированные маршруты
Существует три зарезервированных маршрута:
$route['default_controller'] = 'welcome';
Этот маршрут указывает на действие, которое должно быть выполнено, если URI не содержит данных, что произойдёт при загрузке корневого URL вашего сайта. Настройка принимает значение controller/method, и index() будет значением по умолчанию, если вы его не укажете. В приведенном выше примере это Welcome::index(), которое будет вызываться.
Примечание
Вы НЕ можете использовать каталог в качестве части этого параметра!
Рекомендуется всегда иметь маршрут по умолчанию, так как в противном случае по умолчанию будет отображаться страница 404.
$route['404_override'] = '';
Этот маршрут указывает, какой класс контроллера должен быть загружен, если запрашиваемый контроллер не найден. Он переопределит стандартную страницу ошибки 404. Применяются те же правила, что и для «default_controller», в данном случае для каждого каталога.
Он не повлияет на функцию show_404(), которая будет продолжать загружать стандартный файл ошибки error_404.php в application/views/errors/error_404.php.
$route['translate_uri_dashes'] = FALSE;
Как видно по булевому значению, это не совсем маршрут. Этот параметр позволяет автоматически заменять дефисы (‘-‘) на нижние подчёркивания в сегментах URI контроллера и метода, тем самым экономя дополнительные записи маршрута, если это необходимо. Это необходимо, так как дефис не является допустимым символом для класса или имени метода и может привести к ошибке, если вы попытаетесь его использовать.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/general/routing.html