PHP framework CodeIgniter. Управление внутренней адресацией

Владимир | | CodeIgniter, htaccess, PHP.

CI router
В этой заметке я покажу, как использовать встроенный роутер 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/...

До встречи!