В этой заметке я покажу, как использовать встроенный роутер CodeIgniter'а для решения одной несложной задачи.
Прежде всего, пару слов о том, что это такое и зачем нужно.
Как вы, наверное, знаете CodeIgniter – это php фреймворк, одними из основных достоинств которого являются простота использования и низкая ресурсоемкость. Тем не менее, его возможности практически не уступают более «тяжелым» аналогам.
Одной из таких возможностей и является роутер. Он позволяет с помощью несложных правил настроить внутреннюю адресацию сайта по своему вкусу.
Любой запрос браузера передается роутеру, а уже потом – контроллеру. Таким образом, можно изменить любой из параметров запроса. Например, перенаправить запрос другому контроллеру или добавить/удалить параметры.
Делается это достаточно просто. В файле /application/config/routes.php
нужно задать правила в виде:
$route[‘выражение’] = "новый_адрес";
выражение
– здесь можно использовать регулярные выражения, которые будут использоваться для проверки того, нужно ли применить данное правило к полученному адресу или нет.
Теперь переходим к нашей задаче.
Допустим, у нас есть сайт (блог) и мы хотим создать для каждой из его записей постоянные ссылки (permalink) (такая функция есть практически во всех движках блогов).
Первоначально наши записи доступны по адресу:
http://mysite/index.php/main/goto/postid
Это стандартная адресация в CodeIgniter. Здесь:
main
– названия контроллера;
goto
– имя метода контроллера, который будет обрабатывать запрос;
postid
– номер записи в базе данных.
Нам нужно, чтобы записи были доступны по адресу вида:
http://mysite/index.php/post_permalink
Сами ссылки создать и хранить не сложно. Для этого достаточно к таблице с записями добавить еще одно поле (permalink
) и хранить в нем постоянные ссылки.
Примечание. Все постоянные ссылки должны быть уникальными.
Переходим к роутеру.
Прежде всего, нужно четко понимать как отличить адрес с постоянной ссылкой от обычного. В данном случае отсутствие имени контроллера (main
) в начале адреса означает, что запрос содержит постоянную ссылку. Т.е. в этом случае мы должны перенаправить этот запрос методу goto
.
Если имя контроллера в адресе найдено, то оставляем все без изменений.
Реализуется вся эта система с помощью двух простых правил:
$route['(^main.*$)'] = "$1"; $route['(^.+$)'] = "main/goto/$1";
Первое правило будет применено только для запросов, которые начинаются со слова main
.
Второе правило вставит main/goto/
в начале полученного адреса.
Примечание. Как вы, наверное, догадались, роутер получает только ту часть адреса, которая идет после index.php. И еще одно, порядок следования правил в данном случае важен. Если их поменять местами, то правило $route['(^.+$)'] = "main/goto/$1"
будет использовано для всех адресов.
Теперь взгляните на метод goto.
function goto($permalink) { $pageData['title'] = "Заголовок страницы"; //здесь должен быть код получения записи из БД //запрос может выглядеть так //SELECT * FROM posts WHERE permalink = $permalink $this->load->view('header', $pageData); $this->load->view('page', $pageData); $this->load->view('footer'); }
Как видите, роутер просто меняет адрес и не требует специальной поддержки со стороны контроллера.
Кстати, вы можете передавать любое количество параметров в адресе с постоянной ссылкой. Например:
http://mysite/index.php/post_permalink/par1/par2/...
До встречи!