
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.
Очень полезная статья, всё доступно, всё понятно и главное очень практично.
Я сам только начал изучать Yii2. Может подскажите, если вы знаете об этом что-нибудь?
Вопрос такой. Как реализовать ЧПУ для вложенных категорий. Например, чтобы был такой вид в адресной строке:
ответ на комментарий Сергей от 12.03.2017
ответ на комментарий Сергей от 12.03.2017
Создал дополнительно В БД столбец url на свои категории товаров. Сейчас стоят такие правила для вывода категорий и вид получается такой http://мой-сайт/category/1.html
'category/<id:\d+>/page/<page:\d+>' => 'category/view',
'category/<id:\d+>' => 'category/view'
Пробовал вместо id ставить url не получается. id сам номер видит категории а алиас этот на латинице не видити не показывает сам url.
может что то подскажете как быть?
ответ на комментарий Андрей от 10.05.2017
кроме id «d+» заменить не забыли? Чтобы под правило подходили не только цифры но и буквы, надо поставить
в правилах не вижу чтоб был указан «suffix» .html
Или вы прямо в БД прописываете ".html"? Тогда причина в точке.
Так же, возможно, неправильно выбираете данные из БД. Можно так:
Мои правила:
Но не показывает... Вы написали что дело может быть в контроллере - но как быть если переменная id мне тоже необходима? по id происходит покупка товара в магазине. Подскажите пожалуйста как записать (объявить) в контроллере еще и переменную url, чтобы потом использовать ее в ссылках urlManager.
ответ на комментарий Андрей от 11.05.2017
Ссылки на странице должны быть такого плана (например для перехода на страницу поста):
Пример правил для отдельной страницы поста (с окончанием .html):
Подскажите пожалуйста еще 1 момент, сейчас у меня ссылки формируются напрямую.
То есть Категории показываются так: http://сайт/nike/ тут Все отлично!
Но товары в категории показываются так: http://сайт/air-90-vt.html
А нужно чтобы сначала показ был Категории, а уже потом сам товар: http://сайт/nike/air-90-vt.html
То есть: Сайт/Категория/Товар.html
Мой контроллер товаров:
Мои правила:
Чешу репу как в правилах это реализовать то?
ответ на комментарий Андрей от 11.05.2017
Вот в этой статье можно почитать подробнее - ссылка Там для Yii1 но почти все подходит.
Правило будет такого типа (под себя нужно переделать):