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