Маршруты и красивые адреса
Маршрут в Yii — строка вида post/view: контроллер и действие. По умолчанию он передаётся в параметре r, и адреса выглядят как index.php?r=post/view&id=5. Компонент urlManager превращает их в привычные /posts/5.
Включение красивых адресов
Откройте config/web.php. В разделе components блок urlManager уже есть, но закомментирован. Раскомментируйте его:
// config/web.php
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
],enablePrettyUrl включает адреса без параметра r, showScriptName убирает из них index.php. Теперь список статей открывается по адресу http://localhost:8080/post/index, а статья — по /post/view?id=5.
Правила
Правило связывает шаблон адреса с маршрутом. Правила записывают в массив rules: слева шаблон, справа маршрут.
'rules' => [
'posts' => 'post/index',
'posts/<id:\d+>' => 'post/view',
],Теперь список открывается по адресу /posts, а статья — по /posts/5. Запись <id:\d+> — именованный параметр: id — имя, после двоеточия регулярное выражение «одна или несколько цифр». Значение попадёт в аргумент $id действия. Адрес /posts/abc под правило не подойдёт и вернёт 404.
Правило для метода запроса
Перед шаблоном можно указать HTTP-метод:
'rules' => [
'POST posts' => 'post/create',
'posts' => 'post/index',
],Запрос POST /posts попадёт в действие create, а GET /posts — в index.
Создание ссылок
Адреса не пишут в коде строкой — их строят по маршруту помощником Url:
use yii\helpers\Url;
Url::to(['post/index']); // /posts
Url::to(['post/view', 'id' => 5]); // /posts/5
Url::to(['post/view', 'id' => 5], true); // http://localhost:8080/posts/5
Url::home(); // /Первый элемент массива — маршрут, остальные — параметры. Yii подбирает подходящее правило и собирает адрес. Если шаблон в правилах изменится, все ссылки на сайте обновятся сами.
Настройка веб-сервера
Встроенный сервер php yii serve сам направляет все запросы в index.php. Для Apache это делает файл web/.htaccess, его создают вручную:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.phpЗапросы к существующим файлам (стилям, картинкам) отдаются как есть, остальные передаются в index.php.
Частая ошибка
Правила проверяются сверху вниз, срабатывает первое подходящее. Если поставить общее правило 'posts/<slug>' => 'post/slug' выше правила 'posts/create' => 'post/create', адрес /posts/create уйдёт в первое. Конкретные адреса размещайте выше правил с параметрами.