Yii2. Маршрутизация и создание URL
20.04.2019
Теги: .htaccess • Apache • route • SEO • URL • Web-разработка • 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');
Дополнительно
Поиск: .htaccess • Apache • route • SEO • Web-разработка • Yii2 • Фреймворк • ЧПУ • Routing • Маршрутизация • parseRequest • createUrl • UrlManager • URL