ЧПУ ссылки (URL) для сайта на Yii2 с использованием слов вместо идентификаторов.

В одной из своих статей я уже приводил способ создания таких URL, когда в адресной строке для страниц сайта у нас что-то вроде
http://site.com/behaviors.html,
а не
http://site.loc/frontend/web/index.php?r=post%2Fview&url=behavior

Конечно, если вы выполните описанные на многих ресурсах интернета рекомендации по созданию ЧПУ ссылок, у вас получится примерно так:
http://site.loc/post/21
что-все же далеко от идеала, т.к. 21 - номер поста не дает никакого представления о содержимом данной страницы и кроме того для SEO (продвижения сайта в поисковых системах) не очень хорошо.

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

Все нижеизложенное имеет место если у вас записи, статьи и тд. хранятся в базе данных, т.к. для статических страниц (которые контент хранят прямо в html) и каждая из которых выводится отдельным действием контроллера - все намного упрощается. Пример для них тоже будет ниже.

Для формирования URL адреса словами вместо идентификаторов, это слова (слаги) нужно где-то хранить. Делать это будем в соответствующих таблицах. Например у меня есть таблицы постов, рубрик, меток. Для них я хочу задать свои URL адреса. Поэтому создаем в каждой из этих таблиц поле "url" в каждом таком поле для каждой записи пишем нужный слаг. Он должен быть осмысленным. Согласно примера выше, для адреса http://site.com/behaviors.html в таком поле понадобится записать behaviors. Behaviors переводится как поведения, в yii2 есть такое понятие см. тут. Окончание (суфикс) ".html" добавим отдельно. При желании можно так добавить в URL указатель, что это пост. Тогда ссылка пример вид http://site.com/post/behaviors.html


 

Пример ссылок которые получатся в результате (на примере http://site.com):
  • главная страница: http://site.com
  • список статей: http://site.com/posts
  • страница отдельной статьи: http://site.com/scrolltop.html
  • рубрика: http://site.com/category/yii2
  • метка: http://site.com/tag/events
  • пагинация страниц http://site.loc/posts/page-2


При этом к страницам выводящим отдельную статью добавляется префикс .html
Можно легко удалить ненужное правило или создать свое по образцу.


Вот параметры компонента приложения Yii2 urlManager:

'urlManager' => [
    'showScriptName' => false, //отключаем r=routes
    //запретить стандартные URL если не соответствует правилам класса
    'enableStrictParsing' => true,
    'enablePrettyUrl' => true, //отключаем index.php
    'rules' => array(
 
            'page-<page:\d+>' => 'post/index', //пагинация для главной страницы
            '/' => 'post/index', //главная страница
 
            'site/captcha' => 'site/captcha', //для капчи ничего не меняем
            'sitemap.xml' => 'site/sitemap', //карта сайта
 
            'posts/page-<page:\d+>' => 'post/posts', //пагинация для статей
            'posts' => 'post/posts', //статьи
 
            //вывод статичных страниц
            [           
            'pattern'=>'<action:about|service|contact>',
            'route' => 'site/<action>',
            'suffix' => '.html',
            ],
 
            //login|logout|signup и тд.
            '<action:\w+>' => 'site/<action>',
 
            //вывод отдельной страницы
            [     
            'pattern'=>'<url:\w+>',
            'route' => 'post/view',
            'suffix' => '.html',
            ],
 
            'category/<url:\w+>' => 'category/view', //рубрики
            'tag/<url:\w+>' => 'tag/view', //метки
    ),
],

Данный код нужно разместить в файле frontend\config\main.php одним из элементов массива components.
Код я хорошо прокомментировал, будут вопросы - задавайте в комментариях. Создание правил маршрутизации - дело отдельной статьи. Основаны они на использовании регулярных выражений. Грубо говоря в свойстве массива (слева) пишется выражение описывающее URL который хотим получить, а в значении массива пишем маршрут с учетом структуры фреймворка yii2.
Так же применяется способ описания в отдельном массиве:

 //вывод отдельной страницы
[
'pattern'=>'<url:\w+>',
'route' => 'post/view',
'suffix' => '.html',
],

Первой строкой мы указываем что в URL нас интересует только слаг полученный из БД (ячейка url), поэтому не указываем тут контроллер и действие. Правило получит его в качестве GET параметра. Причем указываем параметр url в кавычках, чтобы подставилось только его значение, состоящее из одной или более букв, цифр и знаков подчеркивания (параметр w+).
Вторая строка значит, что применяться правило должно только для контроллера post и действия view.
Третьей строкой добавляем окончание .html для наших страниц.
Если вы хотите, чтобы была возможность использовать для URL фразы через дефис, например "errors-exceptions.html", поменяйте
<url:\w+>
на
<url:.+>

Как вы, наверняка, знаете, ссылки на страницах сайта должны быть не жесткими, а формироваться таким образом:

<?= Html::a($post->title, ['post/view', 'url' => $post->url]); ?>

тогда при смене доменного имени или правил маршрутизации автоматически сформируются правильные ссылки. Написать можно по-разному, например используя помощник yii\helpers\Url:

<a href="<?=Url::to(['site/about, 'url' => $post->url']) ?>">about</a>

главное использовать средства фреймворка - класс urlManager.

Источник: Перейти
Комментарии (0):
Чтобы оставить свой комментарий, необходимо пройти аутентификацию