Когда запрос от браузера поступает в файл 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');