В статье попытаемся разобраться с процессом формирования ссылок. Прежде чем мы рассмотрим этот процесс, включим ЧПУ ссылки. Про ЧПУ ссылки можно почитать здесь.
'urlManager' => [ 'enablePrettyUrl' => true, // запрещаем index.php 'showScriptName' => false, //// запрещаем r= routes 'rules' => [ // здесь описываем правила формирования ссылок ], ],
Общее правило формирования ссылок в yii фреймворке выглядит следующим образом:
'<контроллер:регулярное_выражение>/<действие:регулярное_выражение>'
=>
'<Контроллер>/<Действие>'
Левая часть правила может видоизменяться. Устанавливаем базовый проект, инструкция по установке здесь. Базовый проект содержит контроллер site и несколько действий about, contact, index, login. Видим что наш проект имеет ссылки следующего вида: http://site.ru/site/index (главная), http://site.ru/site/about (о нас), http://site.ru/site/contact (контакты), http://site.ru/site/login(вход). А ссылки должны иметь следующий красивый вид: http://site.ru (главная), http://site.ru/about (о нас), http://site.ru/contact (контакты), http://site.ru/login(вход), для этого в проекте опишем следующие правила:
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ '/' => 'site/index', 'about' => 'site/about', 'contact' => 'site/contact', 'login' => 'site/login', ],
Преобразуем последние 3 правила в более короткую запись
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ '/' => 'site/index', '<action:\w+>' => 'site/<action>', ],
На сайте есть личный кабинет администратора, его он использует для наполнения сайта. Пропишем основные правила для личного кабинета:
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ '/' => 'site/index', '<action:\w+>' => 'site/<action>', '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view', '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>', '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>', ],
Создадим контроллер News, он будет отвечать за вывод новостей на сайте. Выведем на сайте ленту новостей и сделаем постраничную разбивку и добавим правило:
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ '/' => 'site/index', '<action:\w+ >' => 'site/<action>', 'news/page/<page:\d+>'=>'news/index', '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view', '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>', '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>', ],
Ссылка news/page/?page=1 использующая параметр page, будет преобразована в news/page/1.
Добавим суффикс к ссылке .html
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'suffix' => '.html', 'rules' => [ '/' => 'site/index', '<action:\w+ >' => 'site/<action>', 'news/page/<page:\d+>'=>'news/index', '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view', '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>', '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>', ],
Получаем ссылки следующего вида http://site.ru/about.html, http://site.ru/contact.html , http://site.ru/login.html
Далее изменим cуффикс у ссылки http://site.ru/contact.html на .htm, у оставшихся ссылок оставим суффикс .html
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'suffix' => '.html', 'rules' => [ '/' => 'site/index', '<action:\w+ >' => 'site/<action>', [ 'pattern'=>'contact', 'route' => 'site/contact', 'suffix' => '.htm', ], 'news/page/<page:\d+>'=>'news/index', '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view', '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>', '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>', ],
При реализации RESTful API, зачастую бывает необходимость в том, чтобы один и тот же URL был разобран в разные маршруты, в зависимости от HTTP метода запроса.
[ 'PUT,POST post/<id:\d+>' => 'post/create', 'DELETE post/<id:\d+>' => 'post/delete', 'post/<id:\d+>' => 'post/view', ]
Процесс формирования ссылки неотъемлемо связан с регулярными выражениями. Синтаксис регулярных выражений можно посмотреть здесь