Когда запрос от браузера поступает в файл index.php приложения, браузер анализируется на предмет того, какой контроллер и метод нужно вызвать, чтобы сформировать страницу. Данный процесс называется маршрутизацией. Обратный процесс — создание URL-адреса, когда известны контроллер и метод, которые необходимо вызвать.
Менеджер URL
Менеджер URL представляет собой компонент приложения, который используется для анализа входящих запросов с помощью метода parseRequest(), а также для создания новых URL-адресов с помощью метода createUrl().
Запросы разбираются на маршруты, которые принимают вид controller/action. В данном случае менеджер URL-адресов сообщает Yii2, какой контроллер создавать и какой метод вызывать.
Использование метода createUrl() для формирования URL-адресов гарантирует, что входящие запросы могут быть успешно отображены, потому что гарантированно существуют.
1 2 3 | use yii\helpers\Url; // метод Url::to() вызывает UrlManager::createUrl() для создания URL $url = Url::to([ 'product/view' , 'id' => 123]); |
Маршрутизация
Когда запрос от браузера поступает в файл index.php приложения, браузер анализируется на предмет того, какой контроллер и метод нужно вызвать, чтобы сформировать страницу. Вот каким может быть запрос от браузера (с ЧПУ и без ЧПУ):
1 2 | https: //server.com/index.php/site/login https: //server.com/index.php?r=site/login |
В любом случае, parseRequest() обрабатывает URL-адрес, создает экземпляр класса SiteController и вызывает метод actionLogin().
При использовании ЧПУ менеджер URL-адресов рассмотрит зарегистрированные правила, которые описаны в файле конфигурации:
1 2 3 4 5 6 7 8 9 10 11 | '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-запросов.
Рассмотрим одно из приведенных выше правил подробнее:
1 | '<controller:\w+>/<id:\d+>' => '<controller>/view' , |
В нем говорится, что если получен запрос вида слово/число, отправить этот запрос контроллеру СловоController и вызвать метод actionView($id) с числом в качестве аргумента.
ЧПУ адреса
Чтобы включить ЧПУ (Pretty URLs), нужно активировать enablePrettyUrl в настройках компонента urlManager:
1 2 3 4 5 6 7 8 9 10 11 12 | '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:
1 2 3 4 | RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php |
Здесь показано, что если запрос не идет к реально существующему файлу или каталогу (например, js-скрипт или изображение), тогда его нужно перенаправить на файл index.php.
Маршрут CatchAll
Еще одна приятная функция маршрутизации Yii — возможность легко перевести сайт в режим обслуживания:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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' ); |