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

20.04.2019

Теги: .htaccessApacherouteSEOURLWeb-разработка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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.