Маршрутизация 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 обработчик.

Установка своих собственных правил маршрутизации

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

Подстановка

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

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

В маршруте, где ключ массива содержит URI для совпадения, массив значений содержит значение куда будет совершено перенапраление. В примере выше, если основное слово “product” будет обнаружено в первом сегменте URL, а номер будет обнаружен во втором сегменте, класс “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”. 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”.

С помощью регулярных выражений, вы можете также отловить сегмент содержащий слэш (‘/’), который обычно представляет собой разделитель между несколькими сегментами.

Например, если пользователь обращается к защищенной паролем странице и вы хотите перенаправить его обратно на ту же страницу после входа, этот пример будет полезен вам:

$route['login/(.+)'] = 'auth/login/$1';

Для тех из вас, кто не знаком с регулярными выраженими и желает узнать о них больше, regular-expressions.info < http://www.regular-expressions.info/> может быть хорошей отправной точкой.

Примечание

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

Обратные вызовы (Коллбэки)

Если вы используете PHP >= 5.3, то можете использовать обратные вызовы в местах нормальной маршрутизации для обработки обратных ссылок. Пример:

$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
        return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};

Использование HTTP команд в маршрутах

Возможно использование HTTP команд (request method) для определения правил маршрутизации. Это особенно полезно при построении REST приложений. Вы можете использовать стандартные 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 корневой папки. В примере выше, будет загружен класс “welcome”. Рекомендуется всегда назначать маршрут по умолчанию, так как в противном случае будет отображаться 404 страница.

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

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

$route['translate_uri_dashes'] = FALSE;

Как видно булево значение, это не совсем маршрут. Эта опция позволяет автоматически заменять дефисы на (‘-‘) подчеркивание в URI сегментах контроллеров и методов, тем самым экономя вам дополнительные записи маршрутов, если это нужно. Это необходимо, потому что не допустимый символ в имени класса или имени метода приведет к фатальной ошибке при попытке использовать его.

Важно

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