Роутинг в Yii 2.x - UrlManager (Часть 1)

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

        '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',
]

Процесс формирования ссылки неотъемлемо связан с регулярными выражениями. Синтаксис регулярных выражений можно посмотреть здесь