Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты и красивые адреса

Маршрут в 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 уйдёт в первое. Конкретные адреса размещайте выше правил с параметрами.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.