Маршрутизация и создание URL — Yii2

Когда запрос от браузера поступает в файл index.php приложения, браузер анализируется на предмет того, какой контроллер и метод нужно вызвать, чтобы сформировать страницу. Данный процесс называется маршрутизацией. Обратный процесс — создание URL-адреса, когда известны контроллер и метод, которые необходимо вызвать.

Менеджер URL

Менеджер URL  представляет собой компонент приложения, который используется для анализа входящих запросов с помощью метода parseRequest(), а также для создания новых URL-адресов с помощью метода createUrl().

Запросы разбираются на маршруты, которые принимают вид controller/action. В данном случае менеджер URL-адресов сообщает Yii2, какой контроллер создавать и какой метод вызывать.

Использование метода createUrl() для формирования URL-адресов гарантирует, что входящие запросы могут быть успешно отображены, потому что гарантированно существуют.

use yii\helpers\Url;
// метод Url::to() вызывает UrlManager::createUrl() для создания URL
$url = Url::to(['product/view', 'id' => 123]);

Маршрутизация

Когда запрос от браузера поступает в файл index.php приложения, браузер анализируется на предмет того, какой контроллер и метод нужно вызвать, чтобы сформировать страницу. Вот каким может быть запрос от браузера (с ЧПУ и без ЧПУ):

https://server.com/index.php/site/login
https://server.com/index.php?r=site/login

В любом случае, parseRequest() обрабатывает URL-адрес, создает экземпляр класса SiteController и вызывает метод actionLogin().

При использовании ЧПУ менеджер URL-адресов рассмотрит зарегистрированные правила, которые описаны в файле конфигурации:

'components' => [
    'urlManager' => [
      'class' => 'yii\web\UrlManager',
      /*...*/
      'rules' => [
          '<controller:\w+>/<id:\d+>' => '<controller>/view',
          '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
          '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
          'defaultRoute' => '/site/index',
      ],
  ],

Если ни одно правило не сработает, будет выброшено исключение yii\web\NotFoundHttpException.

Однако, выше установлено значение defaultRoute для перехода на главную страницу сайта. Т.е. будет создан объект класса SiteController и вызван метод actionIndex() для всех не совпадающих URL-запросов.

Рассмотрим одно из приведенных выше правил подробнее:

'<controller:\w+>/<id:\d+>' => '<controller>/view',

В нем говорится, что если получен запрос вида слово/число, отправить этот запрос контроллеру СловоController и вызвать метод actionView($id) с числом в качестве аргумента.

ЧПУ адреса

Чтобы включить ЧПУ (Pretty URLs), нужно активировать enablePrettyUrl в настройках компонента urlManager:

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    // не добавлять в URL index.php
    'showScriptName' => false,
    // запретить r=controller/action
    'enablePrettyUrl' => true,
    'rules' => [
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    ],
],

Также необходимо создать файл .htaccess и включить mod_rewrite для Apache:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Здесь показано, что если запрос не идет к реально существующему файлу или каталогу (например, js-скрипт или изображение), тогда его нужно перенаправить на файл index.php.

Маршрут CatchAll

Еще одна приятная функция маршрутизации Yii — возможность легко перевести сайт в режим обслуживания:

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'language' => 'ru-RU',
    // перевести сайт в режим обслуживания
    'catchAll' => ['site/offline'],
    /*...*/
    'components' => [
        'urlManager' => [
            /*...*/
        ]
    ]
]

Необходимо только добавить метод actionOffline в SiteController.php и представление offline.php.

Создание URL-адресов

Yii2 предоставляет вспомогательный метод yii\helpers\Url::to() для создания ссылок в приложении, которые будут точно соответствовать правилам. Вот несколько примеров создания URL-адресов из документации Yii:

use yii\helpers\Url;
 
// creates a URL to a route: /index.php?r=post%2Findex
echo Url::to(['post/index']);
 
// creates a URL to a route with parameters: /index.php?r=post%2Fview&id=100
echo Url::to(['post/view', 'id' => 100]);
 
// creates an anchored URL: /index.php?r=post%2Fview&id=100#content
echo Url::to(['post/view', 'id' => 100, '#' => 'content']);
 
// creates an absolute URL: http://www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'], true);
 
// creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'], 'https');

Leave a Comment