mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-01 20:19:42 +08:00
Merge pull request #9991 from p0vidl0/patch-1
Update translation [skip ci]
This commit is contained in:
@ -1,286 +1,464 @@
|
||||
Работа с URL
|
||||
Разбор и генерация URL
|
||||
============
|
||||
|
||||
> Замечание: раздел находится в разработке.
|
||||
При обработке запрошенного URL, Yii приложение первым делом разбирает URL в [маршрут](structure-controllers.md#marsruty). Полученный маршрут используется при создании
|
||||
соответствующего экземпляра действия контроллера для обработки запроса. Этот процесс называется *роутинг*.
|
||||
|
||||
Концепция работы с URL в Yii довольно проста. Предполагается, что в приложении используются внутренние маршруты и параметры вместо жестко заданных URL. Тогда фреймворк сам преобразует маршруты в URL и обратно, в соответствии с конфигурацией URL менеджера. Такой подход позволяет изменять вид URL на всем сайте, редактируя единственный конфигурационный файл не трогая код самого приложения.
|
||||
Обратный роутингу процесс называется *Создание URL*, он отвечает за создание URL из заданного маршрута и соответствующих параметров запроса. При необходимости, созданный URL всегда может быть преобразован в
|
||||
первоначальные маршрут и параметры запроса.
|
||||
|
||||
Внутренние маршруты
|
||||
-------------------
|
||||
В основе роутинга и создания URL лежит использование [[yii\web\UrlManager|URL manager]],
|
||||
зарегистрированного в качестве [компонента приложения](structure-application-components.md) `urlManager`.
|
||||
[[yii\web\UrlManager|URL manager]] содержит метод [[yii\web\UrlManager::parseRequest()|parseRequest()]]
|
||||
для разбора входящего запроса на маршрут и параметры запроса, и метод [[yii\web\UrlManager::createUrl()|createUrl()]]
|
||||
для создания URL из заданного маршрута и параметров запроса.
|
||||
|
||||
При создании приложения с помощью Yii, вы будете работать с внутренними маршрутами, которые также часто называются маршрутами c параметрами. Каждому контроллеру и действию соответствует внутренний маршрут, например `site/index` или `user/create`. В первом примере, site - это `ID контроллера` а `create` это ID действия. Если контроллер находится в модуле, то перед его ID контроллера в маршруте ставится `ID модуля`, например так: `blog/post/index`. Здесь `blog` - это ID модуля, а `post` и `index` - ID контроллера и действия соответственно.
|
||||
|
||||
Создание URL
|
||||
------------
|
||||
|
||||
Самое важное при работе с URL = всегда создавать их через URL manager. Это встроенный компонент приложения, к которому можно обращаться по имени `urlManager` как в консольном, так и в веб-приложении, таким образом: `\Yii::$app->urlManager`. Через этот компонент доступны следующие методы создания URL:
|
||||
- `createUrl($params)`
|
||||
- `createAbsoluteUrl($params, $schema = null)`
|
||||
|
||||
Метод `createUrl` создает относительный от корня приложения URL, например `index.php/site/index` . Метод `createAbsoluteUrl` создает абсолютный URL, добавляя к относительному протокол и имя хоста: `http://www.example.com/index.php/site/index` . `createUrl` больше подходит для URL внутри самого приложения, тогда как `createAbsoluteUrl` - для создания ссылок на внешние ресурсы и для них, для решения задач отправки почты, генерации RSS и т.п.
|
||||
|
||||
Примеры:
|
||||
|
||||
```php
|
||||
echo \Yii::$app->urlManager->createUrl(['site/page', 'id' => 'about']);
|
||||
// /index.php/site/page/id/about/
|
||||
echo \Yii::$app->urlManager->createUrl(['date-time/fast-forward', 'id' => 105])
|
||||
// /index.php?r=date-time/fast-forward&id=105
|
||||
echo \Yii::$app->urlManager->createAbsoluteUrl('blog/post/index');
|
||||
// http://www.example.com/index.php/blog/post/index/
|
||||
```
|
||||
|
||||
Точный формат URL зависит от конфигурации URL manager. В другой конфигурации примеры выше могут выводить:
|
||||
|
||||
* `/site/page/id/about/`
|
||||
* `/index.php?r=site/page&id=about`
|
||||
* `/index.php?r=date-time/fast-forward&id=105`
|
||||
* `/index.php/date-time/fast-forward?id=105`
|
||||
* `http://www.example.com/blog/post/index/`
|
||||
* `http://www.example.com/index.php?r=blog/post/index`
|
||||
|
||||
Чтобы упростить создание URL рекомендуется пользоваться встроенным хелпером [[yii\helpers\Url]]. Покажем, как работает хелпер на примерах. Предположим, что мы находимся на /index.php?r=management/default/users&id=10 . Тогда:
|
||||
Настройка компонента `urlManager` в конфигурации приложения, позволяет приложению распознавать различные
|
||||
форматы URL без внесения изменений в существующий код приложения. Например, для
|
||||
создания URL для действия `post/view`, можно использовать следующий код:
|
||||
|
||||
```php
|
||||
use yii\helpers\Url;
|
||||
|
||||
// текущий активный маршрут
|
||||
// /index.php?r=management/default/users
|
||||
echo Url::to('');
|
||||
// Url::to() вызывает UrlManager::createUrl() для создания URL
|
||||
$url = Url::to(['post/view', 'id' => 100]);
|
||||
```
|
||||
|
||||
// тот же контроллер, другое действие
|
||||
// /index.php?r=management/default/page&id=contact
|
||||
echo Url::toRoute(['page', 'id' => 'contact']);
|
||||
В зависимости от настройки `urlManager`, URL может быть создан в одном из следующих форматов (или любом другом формате). При последующем запросе URL в таком формате, он будет разобран на исходные маршрут и параметры запроса.
|
||||
|
||||
```
|
||||
/index.php?r=post/view&id=100
|
||||
/index.php/post/100
|
||||
/posts/100
|
||||
```
|
||||
|
||||
// тот же модуль, другие контроллер и действие
|
||||
// /index.php?r=management/post/index
|
||||
echo Url::toRoute('post/index');
|
||||
## Форматы URL <span id="url-formats"></span>
|
||||
|
||||
// абсолютный маршрут вне зависимости от того, в каком контроллере происходит вызов
|
||||
// /index.php?r=site/index
|
||||
echo Url::toRoute('/site/index');
|
||||
[[yii\web\UrlManager|URL manager]] Поддерживает два формата URL: обычный и ЧПУ (человекопонятные URL).
|
||||
|
||||
// url для регистрозависимого действия hiTech текущего контроллера
|
||||
// /index.php?r=management/default/hi-tech
|
||||
echo Url::toRoute('hi-tech');
|
||||
Обычный формат URL использует параметр `r` для передачи маршрута и любые другие параметры для передачи остальных параметров запроса. Например, URL `/index.php?r=post/view&id=100` задает маршрут `post/view` и параметр `id`, равный 100. Данный формат не требует специальной конфигурации [[yii\web\UrlManager|URL manager]] и работает с любыми настройками Веб сервера.
|
||||
|
||||
// url для регистрозависимого контроллера, `DateTimeController::actionFastForward`
|
||||
// /index.php?r=date-time/fast-forward&id=105
|
||||
echo Url::toRoute(['/date-time/fast-forward', 'id' => 105]);
|
||||
Человекопонятный формат URL представляет собой дополнительный путь, следующий за именем входного скрипта, описывающий маршрут и остальные параметров запроса. Например, дополнительный путь в URL `/index.php/post/100` - это `/post/100`, который может представлять маршрут `post/view` и параметр `id` со значением равным 100, при наличии соответствующего [[yii\web\UrlManager::rules|правила]]. Для использования ЧПУ, необходимо создать набор правил, соответствующих требованиям к URL.
|
||||
|
||||
// получение URL через alias
|
||||
// http://google.com/
|
||||
Yii::setAlias('@google', 'http://google.com/');
|
||||
echo Url::to('@google');
|
||||
Переключение между двумя форматами URL осуществляется при помощи свойства [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] компонента [[yii\web\UrlManager|URL manager]] без внесения изменений в код приложения.
|
||||
|
||||
// получение URL "домой"
|
||||
// /index.php?r=site/index
|
||||
## Роутинг <span id="routing"></span>
|
||||
|
||||
Роутинг осуществляется в два этапа. На первом этапе, входящий запрос разбирается в маршрут и параметры запроса. На втором этапе, для обработки запроса создается [действие контроллера](structure-controllers.md#actions), соответствующее полученному маршруту.
|
||||
|
||||
При использовании простого формата URL, получение маршрута из запроса заключается в получении параметра `r` из массива `GET`.
|
||||
|
||||
При использовании ЧПУ, компонент [[yii\web\UrlManager|URL manager]] ищет среди зарегистрированных [[yii\web\UrlManager::rules|правил]] подходящее для разрешения запроса в маршрут.
|
||||
Если такое правило не найдено, вызывается исключение [[yii\web\NotFoundHttpException]].
|
||||
|
||||
После того, как из запроса получен маршрут, самое время создать действие контроллера, соответствующее этому маршруту.
|
||||
Маршрут разделяется на несколько частей, метками деления служат обратные слеши. Например, маршрут `site/index` будет разделен на `site` и `index`. Каждая из частей представляет собой *идентификатор*, который может ссылаться на модуль, контроллер или действие. Начиная с первой части маршрута, приложение следует следующему алгоритму для создания модуля (если есть), контроллера и действия:
|
||||
|
||||
1. Текущим модулем считаем приложение.
|
||||
2. Проверяем, содержит ли [[yii\base\Module::controllerMap|карта контроллеров]] текущего модуля текущий *идентификатор*.
|
||||
Если содержит, в соответствии с конфигурацией контроллера, найденной в карте, создаем объект контроллера и переходим в п. 5 для обработки оставшейся части маршрута.
|
||||
3. Проверяем, есть ли модуль, соответствующий *идентификатору* в списке модулей (свойство [[yii\base\Module::modules|modules]]) текущего модуля. Если есть, в соответствии с конфигурацией модуля, найденной в списке модулей, создаем модуль и переходим в п. 2, считая только что созданный модуль текущим.
|
||||
4. Рассматриваем *идентификатор* как [идентификатор контроллера](structure-controllers.md#id-kontrollerov) и создаем объект контроллера. Для оставшейся части маршрута выполняем п. 5.
|
||||
5. Контроллер ищет текущий *идентификатор* в его [[yii\base\Controller::actions()|карте действий]]. В случае нахождения, контроллер создает действие, в соответствии с конфигурацией, найденной в карте. Иначе, контроллер пытается создать встроенное действие, описанное медотом, соответствующим текущему [идентификатору действия](structure-controllers.md#id-dejstvij).
|
||||
|
||||
При возникновении ошибок на любом из описанных выше этапов, вызывается исключение [[yii\web\NotFoundHttpException]], указывающее на ошибку в процессе роутинга.
|
||||
|
||||
### Маршрут по умолчанию <span id="default-route"></span>
|
||||
|
||||
В случае, если в результате разбора запроса получен пустой маршрут, вместо него будет использован, так называемый, маршрут по умолчанию. Изначально, маршрут по умолчанию имеет значение `site/index`, и указывает на действие `index` контроллера `site`. Указать свое значение можно при помощи свойства приложения [[yii\web\Application::defaultRoute|defaultRoute]], например так:
|
||||
|
||||
```php
|
||||
[
|
||||
// ...
|
||||
'defaultRoute' => 'main/index',
|
||||
];
|
||||
```
|
||||
|
||||
### Маршрут `catchAll` <span id="catchall-route"></span>
|
||||
|
||||
Иногда возникает необходимость временно перевести приложение в режим обслуживания и отображать одно информационное сообщение для всех запросов. Существует много вариантов реализации этой задачи. Но одним из самых простых, является использование свойства [[yii\web\Application::catchAll]], например так:
|
||||
|
||||
```php
|
||||
[
|
||||
// ...
|
||||
'catchAll' => ['site/offline'],
|
||||
];
|
||||
```
|
||||
|
||||
В данном случае, действие `site/offline` будет обрабатывать все входящие запросы.
|
||||
|
||||
Свойство `catchAll` должно принимать массив, первый элемент которого определяет маршрут, а остальные элементы (пары ключ-значение) определяют параметры, [передаваемые действию](structure-controllers.md#parametry-dejstvij).
|
||||
|
||||
## Создание URL <span id="creating-urls"></span>
|
||||
|
||||
Для создания разных видов URL из заданных маршрутов и параметров, Yii предоставляет метод-помощник [[yii\helpers\Url::to()]]. Примеры:
|
||||
|
||||
```php
|
||||
use yii\helpers\Url;
|
||||
|
||||
// создает URL для маршрута: /index.php?r=post/index
|
||||
echo Url::to(['post/index']);
|
||||
|
||||
// создает URL для маршрута с параметрами: /index.php?r=post/view&id=100
|
||||
echo Url::to(['post/view', 'id' => 100]);
|
||||
|
||||
// создает якорный URL: /index.php?r=post/view&id=100#content
|
||||
echo Url::to(['post/view', 'id' => 100, '#' => 'content']);
|
||||
|
||||
// создает абсолютный URL: http://www.example.com/index.php?r=post/index
|
||||
echo Url::to(['post/index'], true);
|
||||
|
||||
// создает абсолютный URL с использованием схемы https: https://www.example.com/index.php?r=post/index
|
||||
echo Url::to(['post/index'], 'https');
|
||||
```
|
||||
|
||||
Обратите внимание, что в последнем примере подразумевается использование обычного формата URL. При использовании ЧПУ, будут созданы другие URL, соответствующие [[yii\web\UrlManager::rules|правилам создания URL]].
|
||||
|
||||
Маршрут, переданный методу [[yii\helpers\Url::to()]], является контекстно зависимым. Он может быть *относительным* или *абсолютным*, в зависимости от следующих правил:
|
||||
|
||||
- Если маршрут явзяется пустой строкой, будет использован текущий [[yii\web\Controller::route|маршрут]];
|
||||
- Если маршрут не содержит слешей вообще, он рассматривается как *идентификатор* действия текущего контроллера и будет дополнен значением [[\yii\web\Controller::uniqueId|uniqueId]] текущего контроллера в качестве префикса;
|
||||
- Если маршрут не содержит слеша в начале, он будет рассматриваться как маршрут относительно текущего модуля и будет дополнен значением [[\yii\base\Module::uniqueId|uniqueId]] текущего модуля, в качестве префикса.
|
||||
|
||||
Начиная с версии 2.0.2, при составлении маршрутов, стало возможным использовать [псевдонимы](concept-aliases.md). В таком случае, псевдоним будет преобразован в маршрут, который будет использован для создания URL по правилам, указанным выше.
|
||||
|
||||
Для примера, будем считать, что текущим модулем является `admin`, а текущим контроллером - `post`,
|
||||
|
||||
```php
|
||||
use yii\helpers\Url;
|
||||
|
||||
// запрошенный маршрут: /index.php?r=admin/post/index
|
||||
echo Url::to(['']);
|
||||
|
||||
// относительный маршрут с указанием только идентификатора действия: /index.php?r=admin/post/index
|
||||
echo Url::to(['index']);
|
||||
|
||||
// относительный маршрут: /index.php?r=admin/post/index
|
||||
echo Url::to(['post/index']);
|
||||
|
||||
// абсолютный маршрут: /index.php?r=post/index
|
||||
echo Url::to(['/post/index']);
|
||||
|
||||
// /index.php?r=post/index псевдоним "@posts" определен как "/post/index"
|
||||
echo Url::to(['@posts']);
|
||||
```
|
||||
|
||||
В основе реализации метода [[yii\helpers\Url::to()]] лежит использование двух методов компонента [[yii\web\UrlManager|URL manager]]: [[yii\web\UrlManager::createUrl()|createUrl()]] и [[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]]. Ниже будут рассмотрены способы конфигурации [[yii\web\UrlManager|URL manager]] для создания URL в различных форматах.
|
||||
|
||||
Метод [[yii\helpers\Url::to()]], так же, поддерживает создание URL не связанных с маршрутами приложения.
|
||||
В данном случае, нужно передать в качестве первого параметра строку, а не массив. Например,
|
||||
|
||||
```php
|
||||
use yii\helpers\Url;
|
||||
|
||||
// запрошенный URL: /index.php?r=admin/post/index
|
||||
echo Url::to();
|
||||
|
||||
// URL из псевдонима: http://example.com
|
||||
Yii::setAlias('@example', 'http://example.com/');
|
||||
echo Url::to('@example');
|
||||
|
||||
// абсолютный URL: http://example.com/images/logo.gif
|
||||
echo Url::to('/images/logo.gif', true);
|
||||
```
|
||||
|
||||
Кроме метода `to()`, класс [[yii\helpers\Url]] предоставляет и другие удобные методы для создания URL. Например,
|
||||
|
||||
```php
|
||||
use yii\helpers\Url;
|
||||
|
||||
// домашний URL: /index.php?r=site/index
|
||||
echo Url::home();
|
||||
|
||||
Url::remember(); // сохранить URL, чтобы использовать его позже
|
||||
Url::previous(); // получить ранее сохраненный URL
|
||||
// базовый URL, удобно использовать в случае, когда приложение расположено в подкаталоге
|
||||
// относительно корневого каталога Веб сервера
|
||||
echo Url::base();
|
||||
|
||||
// канонический URL запрошенного URL
|
||||
// подробнее https://support.google.com/webmasters/answer/139066?hl=ru
|
||||
echo Url::canonical();
|
||||
|
||||
// запомнить запрошенный URL и восстановить его при следующих запросах
|
||||
Url::remember();
|
||||
echo Url::previous();
|
||||
```
|
||||
|
||||
>**Совет**: чтобы сгенерировать URL с хэштэгом, например `/index.php?r=site/page&id=100#title`, укажите параметр `#` в хелпере таким образом:
|
||||
`Url::to(['post/read', 'id' => 100, '#' => 'title'])`.
|
||||
## Использование человекопонятных URL <span id="using-pretty-urls"></span>
|
||||
|
||||
Также существует метод `Url::canonical()`, который позволяет создать [канонический URL](https://en.wikipedia.org/wiki/Canonical_link_element) (статья на англ., перевода пока нет) для текущего действия. Этот метод при создании игнорирует все параметры действия кроме тех, которые были переданы как аргументы.
|
||||
Пример:
|
||||
Для активации ЧПУ, необходимо настроить компонент `urlManager` в конфигурации приложения следующим образом:
|
||||
|
||||
```php
|
||||
namespace app\controllers;
|
||||
|
||||
use yii\web\Controller;
|
||||
use yii\helpers\Url;
|
||||
|
||||
class CanonicalController extends Controller
|
||||
{
|
||||
public function actionTest($page)
|
||||
{
|
||||
echo Url::canonical();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
При этом при текущем URL `/index.php?r=canonical/test&page=hello&number=42` канонический URL будет `/index.php?r=canonical/test&page=hello`.
|
||||
|
||||
Модификация URL
|
||||
------------------
|
||||
|
||||
По умолчанию Yii использует url формата query string, например `/index.php?r=news/view&id=100`. Чтобы сделать более [человеко-понятные URL](https://ru.wikipedia.org/wiki/%D0%A7%D0%9F%D0%A3_%28%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%29), например для улучшения их читабельности, необходимо сконфигурировать компонент `urlManager` в конфигурационном файле приложения. Придав параметру `enablePrettyUrl` значение `true`, мы тем самым получим URL такого вида: `/index.php/news/view?id=100`, а выставив параметр `showScriptName' => false` мы исключим index.php из URL. Вот фрагмент конфигурационного файла:
|
||||
|
||||
```php
|
||||
<?php
|
||||
return [
|
||||
// ...
|
||||
[
|
||||
'components' => [
|
||||
'urlManager' => [
|
||||
'enablePrettyUrl' => true,
|
||||
'showScriptName' => false,
|
||||
'enableStrictParsing' => false,
|
||||
'rules' => [
|
||||
// ...
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
Обратите внимание, что конфигурация с `'showScriptName' => false` будет работать только, если веб сервер был должным образом сконфигурирован. Смотрите раздел [Установка Yii](start-installation.md#recommended-apache-configuration).
|
||||
|
||||
###Именованные параметры
|
||||
|
||||
Правило может быть связано с несколькими `GET` параметрами. Эти `GET` параметры появляются в паттерне правила как специальные управляющие конструкции в таком формате:
|
||||
|
||||
```
|
||||
<ИмяПараметра:ПаттернПараметра>
|
||||
```
|
||||
|
||||
`ИмяПараметра` это имя `GET` параметра, а необязательный `ПаттернПараметра` - это регулярное выражение, которое используется для того, чтобы найти определенный `GET` параметр. В случае, если `ПаттернПараметра` не указан, это значит, что значение параметра это любая последовательность символов, кроме `/`. Правила используются и при парсинге URL, и при их создании; при создании URL параметры будут заменены на соответствующие значения, а при парсинге - `GET` параметры с соответствующими именами получат соответствующие значения из URL.
|
||||
|
||||
Приведем несколько примеров, чтобы пояснить, как работают правила. Предположим, что наш массив правил содержит три правила:
|
||||
|
||||
```php
|
||||
[
|
||||
'posts'=>'post/list',
|
||||
'post/<id:\d+>'=>'post/read',
|
||||
'post/<year:\d{4}>/<title>'=>'post/read',
|
||||
]
|
||||
```
|
||||
|
||||
Свойство [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] является ключевым, активирует формат ЧПУ.
|
||||
Остальные свойства не обязательные. Однако, в примере выше, показан самый популярный вариант конфигурации ЧПУ.
|
||||
|
||||
- Вызов `Url::toRoute('post/list')` генерирует `/index.php/posts`. Применяется первое правило.
|
||||
- Вызов `Url::toRoute(['post/read', 'id' => 100])` генерирует `/index.php/post/100`. Применяется второе правило.
|
||||
- Вызов `Url::toRoute(['post/read', 'year' => 2008, 'title' => 'a sample post'])` генерирует
|
||||
`/index.php/post/2008/a%20sample%20post`. Применяется третье правило.
|
||||
- Вызов `Url::toRoute('post/read')` генерируется `/index.php/post/read`. Не применяется ни одного правила, вместо этого URL формируется по алгоритму по умолчанию.
|
||||
* [[yii\web\UrlManager::showScriptName|showScriptName]]: это свойство определяет необходимость включения имени входного скрипта в создаваемый URL. Например, при его значении `false`, вместо `/index.php/post/100`, будет сгенерирован URL `/post/100`.
|
||||
* [[yii\web\UrlManager::enableStrictParsing|enableStrictParsing]]: это свойство позволяет включить строгий разбор URL. Если строгий разбор URL включен, запрошенный URL должен соответствовать хотя бы одному из [[yii\web\UrlManager::rules|правил]], иначе будет вызвано исключение [[yii\web\NotFoundHttpException]]. Если строгий разбор URL отключен и ни одно из [[yii\web\UrlManager::rules|правил]] не подходит для разбора запрошенного URL, часть этого URL, представляющая путь, будет использована как маршрут.
|
||||
* [[yii\web\UrlManager::rules|rules]]: это свойство содержит набор правил для разбора и создания URL. Это основное свойство, с которым нужно работать, что бы URL создавались в формате, соответствующем требованиям приложения.
|
||||
|
||||
Таким образом, при использовании `createUrl` для генерации URL, маршрут и переданные методу `GET` параметры используются для принятия решения о том, какое правило применить.
|
||||
Конкретное правило используется для генерации URL, если каждый параметр, указанный в правиле, может быть найден среди `GET` параметров, переданных `createUrl`, и сам маршрут, указанный в правиле, соответствует маршруту, переданному в качестве параметра.
|
||||
> Примечание: Для того, чтобы скрыть имя входного скрипта в создаваемых URL, кроме установки значения свойства [[yii\web\UrlManager::showScriptName|showScriptName]] в `false`, необходимо настроить Веб сервер, чтобы он мог правильно определять PHP скрипт, который должен быть запущен, если в запрошенном URL он не указан явно. Рекомендованные настройки для Apache и Nginx описаны в разделе [Установка Yii](start-installation.md#rekomenduemye-nastrojki-apache).
|
||||
|
||||
Если параметров, переданных `Url::toRoute` больше, чем указано в правиле, то дополнительные параметры будут указаны в формате строки запроса. Например, при вызове `Url::toRoute(['post/read', 'id' => 100, 'year' => 2008])`, мы получим `/index.php/post/100?year=2008`.
|
||||
### Правила URL <span id="url-rules"></span>
|
||||
|
||||
Как было сказано ранее, другое назначение правил - парсинг URL. Это процесс, обратный их созданию. Например, когда пользователь запрашивает `/index.php/post/100`, будет применено второе правило из примера выше, которое извлечет маршрут `post/read` и `GET` параметр `['id' => 100]` (который можно получить так:
|
||||
`Yii::$app->request->get('id')`).
|
||||
Правила URL - это экземпляр класса [[yii\web\UrlRule]] или класса, унаследованного от него. Каждое правило состоит из шаблона, используемого для поиска пути в запрошенном URL, маршрута и нескольких параметров запроса. Правило может быть использовано для разбора запроса в том случае, если шаблон правила совпадает с запрошенным URL. Правило может быть использовано для создания URL в том случае, если его маршрут и параметры запроса совпадают с заданными.
|
||||
|
||||
### Параметры в маршрутах
|
||||
При включенном режиме ЧПУ, компонент [[yii\web\UrlManager|URL manager]] использует правила URL, содержащиеся в его свойстве [[yii\web\UrlManager::rules|rules]], для разбора входящих запросов и создания URL. Обычно, при разборе входящего запроса, [[yii\web\UrlManager|URL manager]] проверяет все правила в порядке их следования, до *первого* правила, соответствующего запрошенному URL. Найденное правило используется для разбора URL на маршрут и параметры запроса. Аналогично для создания URL компонент [[yii\web\UrlManager|URL manager]] ищет первое правило, соответствующее заданному маршруту и параметрам и использует его для создания URL.
|
||||
|
||||
Мы можем обращаться к именованным параметрам в маршрутной части правила. Это позволяет нескольким маршрутам подпадать под правила, в соответствии с переданными параметрами. Это также может помочь минимизировать количество правил URL в приложении, тем самым улучшив его общую производительность.
|
||||
[[yii\web\UrlManager::rules|Правила]] задаются ассоциативным массивом, где ключи определяют шаблоны, а значения соответствующие маршруты. Каждая пара шаблон-маршрут составляет правило разбора URL. Например, следующие [[yii\web\UrlManager::rules|правила]] определяют два правила разбора URL. Первое правило задает соответствие URL `post` маршруту `post/index`. Второе правило задает соответствие URL, соответствующего регулярному выражению `post/(\d+)` маршруту `post/view` и параметру `id`.
|
||||
|
||||
Вот пример, показывающий как использовать маршруты с именованными параметрами.
|
||||
```php
|
||||
[
|
||||
'posts' => 'post/index',
|
||||
'post/<id:\d+>' => 'post/view',
|
||||
]
|
||||
```
|
||||
> Примечание: Шаблон правила используется для поиска соответствия с частью URL, определяющей путь. Например, в URL `/index.php/post/100?source=ad` путь определяет часть `post/100` (начальный и конечный слеши игнорируются), соответствующая регулярному выражению `post/(\d+)`.
|
||||
|
||||
Правила URL можно определять не только в виде пар шаблон-маршрут, но и в виде массива. Каждый массив используется для определения одного правила. Такой вид определения правил используется в случаях, когда необходимо указать другие параметры правила URL. Например,
|
||||
|
||||
```php
|
||||
[
|
||||
// ...другие правила URL...
|
||||
|
||||
[
|
||||
'pattern' => 'posts',
|
||||
'route' => 'post/index',
|
||||
'suffix' => '.json',
|
||||
],
|
||||
]
|
||||
```
|
||||
|
||||
По умолчанию, если в конфигурации правила URL не указан явно параметр `class`, будет создано правило класса [[yii\web\UrlRule]].
|
||||
|
||||
|
||||
### Именованные параметры <span id="named-parameters"></span>
|
||||
|
||||
Правило URL может содержать несколько именованных параметров запроса, которые указываются в шаблоне в следующем формате: `<ParamName:RegExp>`, где `ParamName` определяет имя параметра, а `RegExp` - необязательное регулярное выражение, используемое для определения значения параметра. В случае, если `RegExp` не указан, значением параметра будет любая последовательность символов кроме слешей.
|
||||
|
||||
> Примечание: Возможно указание только регулярного выражения для параметров. В таком случае, остальная часть шаблона будет считаться простым текстом.
|
||||
|
||||
После разбора URL, параметры запроса, соответствующие шаблону правила, будут доступны в массиве `$_GET` через компонент приложения `request`.
|
||||
При создании URL, значения указанных параметров будут вставлены в URL в соответствии с шаблоном правила.
|
||||
|
||||
Рассмотрим несколько примеров работы с именованными параметрами. Допустим, мы определили следующие три правила URL:
|
||||
|
||||
```php
|
||||
[
|
||||
'posts/<year:\d{4}>/<category>' => 'post/index',
|
||||
'posts' => 'post/index',
|
||||
'post/<id:\d+>' => 'post/view',
|
||||
]
|
||||
```
|
||||
|
||||
При разборе следующих URL:
|
||||
|
||||
- `/index.php/posts` будет разобран в маршрут `post/index` при помощи второго правила;
|
||||
- `/index.php/posts/2014/php` будет разобран на маршрут `post/index` и параметры `year` со значением 2014, `category` со значением `php` при помощи первого правила;
|
||||
- `/index.php/post/100` будет разобран на маршрут `post/view` и параметр `id` со значением 100 при помощи третьего правила;
|
||||
- `/index.php/posts/php` вызовет исключение [[yii\web\NotFoundHttpException]], если [[yii\web\UrlManager::enableStrictParsing]] имеет значение `true`, так как правило для разбора данного URL отсутствует. Если [[yii\web\UrlManager::enableStrictParsing]] имеет значение `false` (по умолчанию), значение `posts/php` будет возвращено в качестве маршрута.
|
||||
|
||||
При создании URL:
|
||||
|
||||
- `Url::to(['post/index'])` создаст `/index.php/posts` при помощи второго правила;
|
||||
- `Url::to(['post/index', 'year' => 2014, 'category' => 'php'])` создаст `/index.php/posts/2014/php` при помощи первого правила;
|
||||
- `Url::to(['post/view', 'id' => 100])` создаст `/index.php/post/100` при помощи третьего правила;
|
||||
- `Url::to(['post/view', 'id' => 100, 'source' => 'ad'])` создаст `/index.php/post/100?source=ad` при помощи третьего правила.
|
||||
Параметр `source` не указан в правиле, поэтому он добавлен в созданный URL в качестве параметра запроса.
|
||||
- `Url::to(['post/index', 'category' => 'php'])` создаст `/index.php/post/index?category=php` без использования правил. При отсутствии подходящего правила, URL будет создан простым соединением маршрута, как части пути, и параметров, как части запроса.
|
||||
|
||||
### Параметры в маршрутах <span id="parameterizing-routes"></span>
|
||||
|
||||
В маршруте правила URL возможно указание имен параметров. Это позволяет использовать правило URL для обработки нескольких маршрутов. Например, следующие правила содержат параметры `controller` и `action` в маршрутах.
|
||||
|
||||
```php
|
||||
[
|
||||
'<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>',
|
||||
'<controller:(post|comment)>/<id:\d+>' => '<controller>/read',
|
||||
'<controller:(post|comment)>s' => '<controller>/list',
|
||||
'<controller:(post|comment)>/<id:\d+>' => '<controller>/view',
|
||||
'<controller:(post|comment)>s' => '<controller>/index',
|
||||
]
|
||||
```
|
||||
|
||||
В этом примере, мы использовали два именованных параметра в маршрутной части правил: `controller` и `action`. Первый параметр подходит в случае, если controller ID - это post или comment, а последний - в случае, если action ID - create, update или delete. Имена параметров могут быть разными, но не должны совпадать по имени с GET-параметрами, которые могут появляться в URL.
|
||||
Для разбора URL `/index.php/comment/100/create` будет использовано первое правило, которое установит значения параметров `controller` равным `comment` и `action` равным `create`. Таким образом, маршрут `<controller>/<action>` дубет разрешен в `comment/create`.
|
||||
|
||||
Используя эти правила, URL `/index.php/post/123/create` после парсинга будет иметь маршрут `post/create` с `GET` параметром `id=123`. А с маршрутом `comment/list` и `GET` параметром `page=2` можно создать URL `/index.php/comments?page=2`.
|
||||
Аналогично, для маршрута `comment/index`, при помощи третьего правила, будет создан URL `comment/index`.
|
||||
|
||||
### Параметры в имени хоста
|
||||
> Примечание: Использование параметров в маршрутах позволяет значительно уменьшить количество правил URL и улучшить производительность компонента [[yii\web\UrlManager|URL manager]].
|
||||
|
||||
Существует возможность включать имена хостов в правила парсинга и создания URL. Например, может возникнуть необходимость получить часть имени хоста в качестве `GET` параметра, чтобы работать с поддоменами. Например, URL `http://admin.example.com/en/profile` может быть разобран на `GET` параметры `user=admin` и `lang=en`. Аналогично, правила с именами хостов могут использоваться для создания URL.
|
||||
По умолчанию, все параметры, указанные в правиле, являются обязательными. Если запрошенный URL не содержит обязательный параметр, или если URL создается без обязательного параметра, данное правило не будет применено. Свойство [[yii\web\UrlRule::defaults]] позволяет сделать нужные параметры не обязательными. Параметры, перечисленные в данном свойстве, будут иметь заданные значения, в случае если они пропущены.
|
||||
|
||||
Чтобы использовать параметры в имени хоста, просто объявите правило с именем хоста, например,
|
||||
В следующем правиле описаны необязательные параметры `page` и `tag`, которые примут значения `1` и `пустая строка` в случае, если они будут пропущены.
|
||||
|
||||
```php
|
||||
[
|
||||
'http://<user:\w+>.example.com/<lang:\w+>/profile' => 'user/profile',
|
||||
// ...другие правила...
|
||||
[
|
||||
'pattern' => 'posts/<page:\d+>/<tag>',
|
||||
'route' => 'post/index',
|
||||
'defaults' => ['page' => 1, 'tag' => ''],
|
||||
],
|
||||
]
|
||||
```
|
||||
|
||||
В этом примере первый сегмент имени хоста обрабатывается как имя пользователя (user), тогда как первый сегмент пути обрабатывается как параметр языка (lang). Правило относится к маршруту `user/profile`.
|
||||
Выше приведенное правило может быть использовано для разбора или создания следующих URL:
|
||||
|
||||
Обратите внимание, что атрибут [[yii\web\UrlManager::showScriptName]] не оказывает действия на правила, в которых используются параметры в имени хоста.
|
||||
* `/index.php/posts`: `page` равно 1, `tag` равно ''.
|
||||
* `/index.php/posts/2`: `page` равно 2, `tag` равно ''.
|
||||
* `/index.php/posts/2/news`: `page` равно 2, `tag` равно `'news'`.
|
||||
* `/index.php/posts/news`: `page` равно 1, `tag` равно `'news'`.
|
||||
|
||||
Также учтите, что любое правило с параметрами в имени хоста не должно содержать подпапку, если приложение размещено в подпапке web рута. Например, если приложение находится в `http://www.example.com/sandbox/blog`, тогда нам все равно в правиле нужно его прописать без `sandbox/blog`.
|
||||
Без использования необязательных параметров понадобилось бы создать 4 правила для достижения того же результата.
|
||||
|
||||
### Добавка суффикса URL
|
||||
|
||||
### Правила с именами серверов <span id="rules-with-server-names"></span>
|
||||
|
||||
Существует возможность включать имена серверов в шаблон правил URL. Главным образом, это удобно, когда требуется разное поведение приложения, в зависимости от разных имен Веб серверов. Например, следующее правило позволит разобрать URL `http://admin.example.com/login` в маршрут `admin/user/login` и `http://www.example.com/login` в `site/login`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
return [
|
||||
// ...
|
||||
'components' => [
|
||||
'urlManager' => [
|
||||
'suffix' => '.html',
|
||||
],
|
||||
],
|
||||
];
|
||||
[
|
||||
'http://admin.example.com/login' => 'admin/user/login',
|
||||
'http://www.example.com/login' => 'site/login',
|
||||
]
|
||||
```
|
||||
|
||||
### Обработка REST запросов
|
||||
|
||||
TBD:
|
||||
- RESTful маршрутизация: [[yii\filters\VerbFilter]], [[yii\web\UrlManager::$rules]]
|
||||
- Json API:
|
||||
- response: [[yii\web\Response::format]]
|
||||
- request: [[yii\web\Request::$parsers]], [[yii\web\JsonParser]]
|
||||
|
||||
|
||||
Парсинг URL
|
||||
-----------
|
||||
|
||||
Помимо создания URL Yii также умеет парсить URL, получая на выходе маршруты и параметры.
|
||||
|
||||
### Строгий парсинг URL
|
||||
|
||||
По умолчанию если для URL не подошло ни одного заданного правила и URL соответствует стандартному формату, как, например `/site/page`, Yii делает попытку запустить указанный action соответствующего контроллера. Можно запретить обрабатывать URL стандартного формата, тогда, если URL не соответствует ни одному правилу, будет выброшена 404 ошибка.
|
||||
Также возможно комбинирование параметров и имени сервера для динамического извлечения данных из него. Например, следующее правило позволит разобрать URL `http://en.example.com/posts` на маршрут и параметр `language=en`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
return [
|
||||
// ...
|
||||
[
|
||||
'http://<language:\w+>.example.com/posts' => 'post/index',
|
||||
]
|
||||
```
|
||||
|
||||
> Примечание: Правила, содержащие имя сервера, НЕ должны содержать в шаблоне подкаталог пути ко входному скрипту. Например, если приложение расположено в `http://www.example.com/sandbox/blog`, шаблон должен быть `http://www.example.com/posts`, вместо `http://www.example.com/sandbox/blog/posts`. Это позволит изменять расположение приложения без необходимости внесения изменений в его код.
|
||||
|
||||
### Суффиксы в URL <span id="url-suffixes"></span>
|
||||
|
||||
Компонент предоставляет возможность добавления к URL суффиксов. Например, можно добавить к URL `.html`, что бы они выглядели как статические HTML страницы; можно добавить к URL суффикс `.json`, для указания на ожидаемый тип данных ответа. Настроить суффиксы в URL можно при помощи соответствующего свойства [[yii\web\UrlManager::suffix]] в конфигурации приложения:
|
||||
|
||||
```php
|
||||
[
|
||||
'components' => [
|
||||
'urlManager' => [
|
||||
'enablePrettyUrl' => true,
|
||||
'showScriptName' => false,
|
||||
'enableStrictParsing' => true,
|
||||
'suffix' => '.html',
|
||||
'rules' => [
|
||||
// ...
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
]
|
||||
```
|
||||
|
||||
Создание классов для произвольных правил
|
||||
------------------------------
|
||||
Данная конфигурация позволяет компоненту [[yii\web\UrlManager|URL manager]] разбирать и создавать URL с суффиксом `.html`.
|
||||
|
||||
[[yii\web\UrlRule]] класс используется для парсинга URL на параметры и создания URL по параметрам. Обычное решение для правил подойдет для большинства проектов, но бывают ситуации, когда лучшим выбором будет использования своего класса для задания правил. Например, на сайте автомобильного дилера могут быть URL типа `/Производитель/Модель`, где и `Производитель` и `Модель` хранятся в таблице БД. Обычное правило не сработает, т.к. оно основывается на статически заданных регулярных выражений, и извлечение информации из БД в нем не предусмотрено.
|
||||
> Подсказка: При установке суффикса `/`, все URL будут заканчиваться слешем.
|
||||
|
||||
Мы можем создать новый класс для правил URL, унаследовав его от [[yii\web\UrlRule]] и использовав его в одном или нескольких URL правил. Ниже - реализация для вышеописанного примера с сайтом автомобильного дилера. Вот указание произвольного правила в конфигурации приложения:
|
||||
> Примечание: При настроенном суффиксе, все URL не содержащие этот суффикс будут расценены как неизвестные URL. Такое поведение рекомендовано для SEO (поисковая оптимизация).
|
||||
|
||||
Иногда возникает необходимость использовать разные суффиксы для разных URL. Добиться этого можно настройкой свойства [[yii\web\UrlRule::suffix|suffix]] у каждого правила. Когда это свойство установлено, оно имеет приоритет перед общей конфигурацией компонента [[yii\web\UrlManager|URL manager]]. Например, Следующая конфигурация содержит правило URL, `.json` as its suffix instead of the global one `.html`.
|
||||
|
||||
```php
|
||||
// ...
|
||||
'components' => [
|
||||
'urlManager' => [
|
||||
'rules' => [
|
||||
'<action:(login|logout|about)>' => 'site/<action>',
|
||||
|
||||
// ...
|
||||
|
||||
['class' => 'app\components\CarUrlRule', 'connectionID' => 'db', /* ... */],
|
||||
[
|
||||
'components' => [
|
||||
'urlManager' => [
|
||||
'enablePrettyUrl' => true,
|
||||
'showScriptName' => false,
|
||||
'enableStrictParsing' => true,
|
||||
'suffix' => '.html',
|
||||
'rules' => [
|
||||
// ...
|
||||
[
|
||||
'pattern' => 'posts',
|
||||
'route' => 'post/index',
|
||||
'suffix' => '.json',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
]
|
||||
```
|
||||
|
||||
В примере мы используем произвольное URL правило `CarUrlRule` для обработки URL формата `/Производитель/Модель`.
|
||||
|
||||
Код самого класса может быть примерно таким:
|
||||
### HTTP методы <span id="http-methods"></span>
|
||||
|
||||
При реализации RESTful API, зачастую бывает необходимость в том, чтобы один и тот же URL был разобран в разные маршруты, в зависимости от HTTP метода запроса. Это легко достигается указанием HTTP методов, поддерживаемых правилом в начале шаблона. Если правило поддерживает несколько HTTP методов, их имена разделяются запятыми. Например, следующие правила имеют шаблон `post/<id:\d+>` с разными поддерживаемыми HTTP методами. Запрос `PUT post/100` будет разобран в маршрут `post/create`, в то время, как запрос `GET post/100` будер разобран в `post/view`.
|
||||
|
||||
```php
|
||||
[
|
||||
'PUT,POST post/<id:\d+>' => 'post/create',
|
||||
'DELETE post/<id:\d+>' => 'post/delete',
|
||||
'post/<id:\d+>' => 'post/view',
|
||||
]
|
||||
```
|
||||
|
||||
> Примечание: Если правило URL содержит HTTP метод в шаблоне, это правило будет использовано только при разборе URL. Такое правило не будет учитываться компонентом [[yii\web\UrlManager|URL manager]] при создании URL.
|
||||
|
||||
> Подсказка: Для упрощения маршрутизации RESTful API, Yii предоставляет специальный класс [[yii\rest\UrlRule]], который достаточно эффективен и предоставляет такие удобные возможности, как автоматическое приведение идентификаторов контроллеров к множественной форме. Более подробную информацию можно найти в разделе Веб-сервисы REST [Роутинг](rest-routing.md).
|
||||
|
||||
|
||||
### Гибкая настройка правил <span id="customizing-rules"></span>
|
||||
|
||||
В предыдущих примерах, преимущественно, приводились правила URL, заданные парами шаблон-маршрут. Это самый распространенный, краткий формат. В некоторых случаях возникает необходимость более гибкой настройки правил, например указание суффикса при помощи свойства [[yii\web\UrlRule::suffix]]. Пример конфигурации правила URL при помощи массива был рассмотрен в главе [Суффиксы в URL](#suffiksy-v-url):
|
||||
|
||||
```php
|
||||
[
|
||||
// ...другие правила URL...
|
||||
|
||||
[
|
||||
'pattern' => 'posts',
|
||||
'route' => 'post/index',
|
||||
'suffix' => '.json',
|
||||
],
|
||||
]
|
||||
```
|
||||
|
||||
> Информация: По умолчанию, если в конфигурации правила явно незадан параметр `class`, будет создано правило класса [[yii\web\UrlRule]].
|
||||
|
||||
|
||||
### Добавление правил URL динамически <span id="adding-rules"></span>
|
||||
|
||||
Правила URL могут быть динамически добавлены в компонент [[yii\web\UrlManager|URL manager]]. Часто это необходимо подключаемым [модулям](structure-modules.md) для настройки своих правил URL. Для того, что бы динамически добавленные правила могли влиять на процесс роутинга, они должны быть добавлены в процессе [предзагрузки](runtime-bootstrapping.md). В частности, модули должны реализовываться интерфейс [[yii\base\BootstrapInterface]] и добавлять правила в методе [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]], например:
|
||||
|
||||
```php
|
||||
public function bootstrap($app)
|
||||
{
|
||||
$app->getUrlManager()->addRules([
|
||||
// правила URL описываются здесь
|
||||
], false);
|
||||
}
|
||||
```
|
||||
|
||||
Так же, необходимо включить данный модуль в [[yii\web\Application::bootstrap]], чтобы он смог участвовать в процессе [предзагрузки](runtime-bootstrapping.md).
|
||||
|
||||
|
||||
### Создание классов правил <span id="creating-rules"></span>
|
||||
|
||||
Несмотря на то, что встроенный класс [[yii\web\UrlRule]] достаточно функционален для большинства проектов, иногда возникает необходимость в создании своего класса правил URL. Например, на сайте продавца автомобилей существует необходимость поддержки URL в таком формате: `/Manufacturer/Model`, где и `Manufacturer` и `Model` должны соответствовать данным, хранящимся в базе данных. Стандартный класс [[yii\web\UrlRule]] не подойдет, так как он расчитан на работу со статичными шаблонами.
|
||||
|
||||
Для решения данной проблемы можно создать такой класс правила URL.
|
||||
|
||||
```php
|
||||
namespace app\components;
|
||||
|
||||
use yii\web\UrlRule;
|
||||
use yii\web\UrlRuleInterface;
|
||||
use yii\base\Object;
|
||||
|
||||
class CarUrlRule extends UrlRule
|
||||
class CarUrlRule extends Object implements UrlRuleInterface
|
||||
{
|
||||
public $connectionID = 'db';
|
||||
|
||||
public function init()
|
||||
{
|
||||
if ($this->name === null) {
|
||||
$this->name = __CLASS__;
|
||||
}
|
||||
}
|
||||
|
||||
public function createUrl($manager, $route, $params)
|
||||
{
|
||||
@ -291,21 +469,42 @@ class CarUrlRule extends UrlRule
|
||||
return $params['manufacturer'];
|
||||
}
|
||||
}
|
||||
return false; // это правило не подходит
|
||||
return false; // данное правило не применимо
|
||||
}
|
||||
|
||||
public function parseRequest($manager, $request)
|
||||
{
|
||||
$pathInfo = $request->getPathInfo();
|
||||
if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
|
||||
// check $matches[1] and $matches[3] to see
|
||||
// if they match a manufacturer and a model in the database
|
||||
// If so, set $params['manufacturer'] and/or $params['model']
|
||||
// and return ['car/index', $params]
|
||||
// Ищем совпадения $matches[1] и $matches[3]
|
||||
// с данными manufacturer и model в базе данных
|
||||
// Если нашли, устанавливаем $params['manufacturer'] и/или $params['model']
|
||||
// и возвращаем ['car/index', $params]
|
||||
}
|
||||
return false; // это правило не подходит
|
||||
return false; // данное правило не применимо
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Кроме использования произвольных классов URL в случаях, подобных примеру выше, их также можно использовать для других целей. Например, мы можем написать класс правила для логгирования парсинга URL и создания запросов. Это может быть полезно на этапе разработки. Мы также можем написать класс правила чтобы показывать особую 404 страницу в случае, если другие правила не подошли для обработки текущего запроса. В этом случае произвольное правило должно стоять последним.
|
||||
И использовать новый класс [[yii\web\UrlManager::rules]] при определении правил URL:
|
||||
|
||||
```php
|
||||
[
|
||||
// ...другие правила...
|
||||
|
||||
[
|
||||
'class' => 'app\components\CarUrlRule',
|
||||
// ...настройка других параметров правила...
|
||||
],
|
||||
]
|
||||
```
|
||||
|
||||
## Производительность <span id="performance-consideration"></span>
|
||||
|
||||
При разработке сложных Веб приложений, важно оптимизировать правила URL так, чтобы разбор запросов и создание URL занимали минимальное время.
|
||||
|
||||
Использование параметров в маршрутах позволяет уменьшить количество правил, что значительно увеличивает производительность.
|
||||
|
||||
При разборе или создании URL, компонент [[yii\web\UrlManager|URL manager]] проверяет правила в порядке их определения. Поэтому следует более узконаправленные и/или часто используемые правила размещать раньше прочих.
|
||||
|
||||
В случае, если несколько правил имеют один и тот же префикс в шаблоне или маршруте, можно рассмотреть использование [[yii\web\GroupUrlRule]], что позволит компоненту [[yii\web\UrlManager|URL manager]] более эффективно обрабатывать правила группами. Часто это бывает полезно в случае, если приложение состоит из модулей, каждый из которых имеет свой набор правил с идентификатором модуля в качестве общего префикса.
|
||||
|
||||
Reference in New Issue
Block a user