Yii PHP framework: создаём игровой сайт. Часть 11. Человекопонятные URL.

Владимир | | PHP, Web разработка, Yii.

yii game site permalinks

В предыдущих частях мы практически доделали наш игровой сайт. Он в рабочем состоянии, но некоторые вещи выглядят не лучшим образом, и, прежде всего, это касается вида URL страниц.

По-умолчанию, Yii фреймоворк использует следующую схему для формирования адреса страниц:

http://имя_сайта.домен/index.php?r=контроллер/действие&параметр1=значение1...

Т.е. адрес формируется из GET параметров. В них передаётся вся информация, необходимая фреймворку для определения того, какую именно страницу нужно сформировать.

Все отлично, но в таком виде адрес очень плохо читается. Желательно было бы его сократить и использовать запись без GET параметров. Фреймворк позволяет нам сделать это, не изменяя код приложения. Нужно только указать соответствующие правила в файле конфигурации приложения (protected/config/main.php).

Вообще, я очень советую вам почитать официальный тьюториал Красивые адреса URL, а здесь мы рассмотрим, что можно сделать для нашего сайта.

На данный момент ссылки стандартные и имеют вид.

Страница с игрой
index.php?r=games/show&id=367

Игры выбранного жанра
index.php?r=games/list&type_id=1

Страницы игр выбранного жанра
index.php?r=games/list&type_id=4&page=2

Страницы общего списка игр
index.php?r=games/list&page=2

Архивы
index.php?r=games/archive&year=2010&month=1

Список скриншотов
index.php?r=screenshots/list

Выбранный скриншот
index.php?r=screenshots/show&id=2274

За работу с URL отвечает компонент urlManager. Попробуем просто его подключить и посмотрим, что изменится. Для этого добавляем в конфиг (protected/config/main.php) элемент urlManager в массив components.

'components'=>array(
…
	'urlManager'=>array(
		'urlFormat'=>'path',
…
	),
),

Обновляем страницу сайта и смотрим, как изменились url.

index.php/games/list
index.php/games/show/id/371
index.php/games/list/page/2
index.php/games/list/type_id/1
index.php/games/archive/year/2010/month/1
index.php/screenshots/show/id/2565
index.php/screenshots/list
index.php/screenshots/list/page/2

Учтите, что изменение произошло потому, что мы не прописывали «жёстко» ни одного url. Везде для формирования ссылок мы пользовались встроенными библиотеками фреймворка.

В принципе, этот вариант уже значительно лучше, но некоторые адреса содержат избыточную информацию.

Например, для показа страницы с игрой нам не нужен сегмент id в адресе, т.е. можно использовать вместо
index.php/games/show/id/371
более короткий адрес
index.php/games/show/371

Для этого создадим массив с правилами преобразования адресов.

'urlManager'=>array(
	'urlFormat'=>'path',
	'rules'=>array(
		'games/show/'=>'games/show',
…
	),
),

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

routing

Значение элемента должно содержать имена контроллера и действия (action), которые должны быть вызваны. Ключ элемента содержит начальные сегменты адреса (они не обязательно должны совпадать с названием контроллера и действия). После них в угловых скобках идет перечень параметров.

Параметры задаются в виде пары: имя параметра, шаблон, и разделяются двоеточием. При этом шаблон является обычным регулярным выражением. В данном случае мы \d+ означает – одна или более цифр.

Рассмотрим чуть более сложный пример. Уберём сегменты month и year из url архива.

'games/archive//'=>'games/archive'

Как видите, принцип точно такой же, только в этом случае в указываем два параметра. В результате url архивов будут выглядеть так.
index.php/games/archive/2010/1

Следующий шаг – убираем из адреса index.php.

Сделать это только средствами одного фреймворка без поддержки вебсервера невозможно. Если используется Apache, необходимо чтобы был подключен модуль mod_rewrite.

Создаём в корне сайта файл .htaccess со следующим содержимым.

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# если директория или файл существуют, используем их
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# в противном случае перенаправляем запрос через index.php
RewriteRule . index.php

Тут нет никакого смысла изобретать велосипед. Эти правила обычные, я их взял из официальной документации.

Теперь нужно рассказать фреймворку, что адреса страниц нужно создавать без index.php.

Для этого используется параметр 'showScriptName'=>false.

Окончательно конфигурационный файл выглядит так.

'urlManager'=>array(
	'urlFormat'=>'path',
	'rules'=>array(
		'games/show/'=>'games/show',
		'screenshots/show/'=>'screenshots/show',
		'games/archive//'=>'games/archive',
	),
	'showScriptName'=>false,
),

Естественно, это не все возможности компонента urlManager, но для нашего сайта их достаточно. Подробнее их описание вы найдёте в соответствующем разделе документации.

На этом я закончу цикл об игровом сайте. Естественно, обо всех возможностях Yii фреймворка я не рассказал, да и задача так не ставилась. Конечно, сайт можно улучшать, добавлять возможности, но он работает. Если у вас есть вопросы, что-то осталось неясным, пишите, постараюсь ответить, может из этих ответов продолжение получится 😉

Все разделы цикла.

  1. Yii PHP framework: создаём игровой сайт. Часть 1. Постановка задачи.
  2. Yii PHP framework: создаём игровой сайт. Часть 2. База данных и установка фреймворка.
  3. Yii PHP framework: создаём игровой сайт. Часть 3. Аутентификация.
  4. Yii PHP framework: создаём игровой сайт. Часть 4. Работа с жанрами игр.
  5. Yii PHP framework: создаём игровой сайт. Часть 5. Импорт игр.
  6. Yii PHP framework: создаём игровой сайт. Часть 6. Формируем страницы игр и жанров.
  7. Yii PHP framework: создаём игровой сайт. Часть 7. Работа с JavaScript и страницы игр.
  8. Yii PHP framework: создаём игровой сайт. Часть 8. Создаём виджеты.
  9. Yii PHP framework: создаём игровой сайт. Часть 9. Поиск ошибок.
  10. Yii PHP framework: создаём игровой сайт. Часть 10. Панель управления.
  11. Yii PHP framework: создаём игровой сайт. Часть 11. Человекопонятные URL.
  12. Архив с исходниками

Интересно почитать

Для всех вебмастеров, которым приходится работать с Linux серверами, пригодится Конспект лекций по курсу «Администратор ПК с Linux».