Роутинг в Yii2 – UrlManager

В прошлом посте мы рассмотрели как убрать web и включить ЧПУ в Yii2. В этой статье поговорим о маршрутизации или роутинге в Yii2, разберем принципы создания правил маршрутизации для статических и динамических URL-адресов приложения, а также генерацию ссылок.

При включении ЧПУ необходимо было раскомментировать или вставить, если отсутствует следующий код:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        // Пользовательские правила
    ],
],

В массив «rules» вписываются правила формирования ссылок. По дефолту ссылка формируется следующим образом: домен/контроллер/вид.

http://site.ru/site/login
http://site.ru/site/about
http://site.ru/site/contact

Здесь site.ru гипотетический домен сайта, site – это дефолтный контроллер фреймворка SiteController, ну а login, about и contact – дефолтные виды (представления). Для того, чтобы убрать контроллер из УРЛ-адреса и получить более короткие ссылки:

http://site.ru/login
http://site.ru/about
http://site.ru/contact

Нужно прописать вот такие правила:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'login' => 'site/login',
        'about' => 'site/about',
        'contact' => 'site/contact',
    ],
],

Объединяем три правила в одно:

'<action:(login|about|contact)>' => 'site/<action>',

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

'<action:\w+>' => 'site/<action>',

Добавляем расширение .html для всех страниц, кроме главной:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'suffix' => '.html',
    'rules' => [
        [
           'pattern'=>'/',
           'route' => 'site/index',
           'suffix' => '',
        ],
        '<action:\w+>' => 'site/<action>',
    ],
],

Добавляем расширение .html только для страницы about:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        [
           'pattern'=>'/',
           'route' => 'site/index',
           'suffix' => '',
        ],
        [
           'pattern'=>'about',
           'route' => 'site/about',
           'suffix' => '.html',
        ],
        '<action:\w+>' => 'site/<action>',
    ],
],

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

Для закрепления рассмотрим настройку роутинга для блога. Например: есть контроллер BlogController и два представления index и view.

  • index – вид для отображения всех статей.
  • view – вид для показа одной статьи.

Нужно также учесть, что статей может быть много и будет реализована постраничная навигация (пагинация), поэтому нужно реализовать правила для второй, третьей и т.д. страниц блога.

// Если в адресах статей используем ID
// http://site.ru/blog/157
'blog/<id:\d+>' => 'blog/view',

// Если в адресах статей используем Алиас
// http://site.ru/blog/statya
'blog/<alias:[\w-]+>' => 'blog/view',

// Динамические УРЛ-адреса для страниц пагинации
// http://site.ru/blog/page/2
'blog/page/<page:\d+>' => 'blog/index',

// Первая страница блога
// http://site.ru/blog
'blog' => 'blog/index',

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

Генерация ссылок в Yii2 с помощью хелпера URL

После установки правил маршрутизации в «UrlManager» возникает вопрос: а как собственно генерировать ссылки? Для генерации ссылок во фреймворке Yii2 существует несколько способов. Рассмотрим один из них, на мой взгляд, самый удобный и понятный, воспользуемся хелпером «URL» и его методом to().

Импортируем пространство имен в представление:

use yii\helpers\Url;

Метод to() нужно вызывать прямо в атрибуте href:

<a href="<?=Url::to(['site/about'])?>">Анкор ссылки</a>
// Если пространство имен не было импортировано с помощью use
<a href="<?=\yii\helpers\Url::to(['site/about')?>">Анкор ссылки</a>

При этом будет сгенерирована ссылка, исходя из правил, установленных в «UrlManager». Метод to() позволяет генерировать и динамические ссылки:

// Алиас подставляется динамически для каждой статьи свой
<a href="<?=Url::to(['blog/view', 'alias' => $blog->alias])?>">Анкор ссылки</a>
// Аналогично при использовании ID
<a href="<?=Url::to(['blog/view', 'id' => $blog->id])?>">Анкор ссылки</a>

В выше указанных случаях генерируются относительные ссылки: /about, /blog/statya и /blog/157. Для получения абсолютных ссылок нужно поставить параметр $scheme в true или же указать протокол соединения http или https.

// Абсолютная ссылка, протокол будет установлен исходя из настроек сайта 
<a href="<?=Url::to(['site/about'], true)?>">Анкор ссылки</a>
// Принудительно устанавливаем обычный http протокол
<a href="<?=Url::to(['site/about'], 'http')?>">Анкор ссылки</a>
// Принудительно устанавливаем защищенный https протокол
<a href="<?=Url::to(['site/about'], 'https')?>">Анкор ссылки</a>

Как видите, все достаточно просто и удобно. При использовании метода to() хелпера «URL», даже изменив правила маршрутизации в «UrlManager», вносить правки в сами ссылки в большинстве случаев не придется. В следующем посте рассмотрим структуру basic-прирложения фреймворка Yii2.

Похожие записи:

Добавить комментарийОтменить ответ

Нажимая на кнопку «Добавить», я даю согласие на обработку своих персональных данных в соответствии с политикой конфиденциальности