Роутинг в DotPlant2 основан на Yii2. Основные настройки хранятся в конфиге @app/config/web.php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'login/<service:google_oauth|facebook|etc>' => 'default/login',
'login' => 'default/login',
'logout' => 'default/logout',
'signup' => 'default/signup',
'cart/payment-result/<id:.+>' => 'cart/payment-result',
'search' => 'default/search',
'robots.txt' => 'seo/manage/get-robots',
[
'class' => 'app\components\PageRule',
],
[
'class' => 'app\components\ObjectRule',
],
],
],
Подробнее об формировании url можно прочитать в документации Yii2 Routing and URL Creation
Матчинг для нестатичных вариантов URL идёт по массиву rules сверху вниз. Статичные правила очевидны для тех, кто знаком с принципами роутинга в Yii2. Отдельно стоит упомянуть robots.txt - это сделано, чтобы /robots.txt можно было бы хранить в базе, редактировать через админку и отдавать динамикой.
Динамические правила - то, что предстовляет собой наибольшую ценность и интерес. Первый класс - PageRule отвечает за обработку и формирование урлов контентных страниц. Матчинг элементарный - по урлу (см \app\modules\page\models\Page::getByUrlPath()). Второй - ObjectRule - отвечает за все особои случаи и возможности:
route и обрабытаваются по очередиЕсли и ObjectRule не удалось найти подходящий роут, пробуется выполнится стандартный для Yii2 обработчик “красивых” урлов:
module/controller/actionmodule/controller[/index]controller/actioncontroller[/index]routeСтруктура таблицы элементарна:
| id | route | url_template | object_id |
name |
|---|---|---|---|---|
| 1 | shop/product/list | json here | 2 |
route - какой роут будет обработан в случае если URL соответствует правилуurl_templalte - закодированны json массивobject_id - id объекта (смотри таблицу object)name не используются в существующей кодовой базеurl_templateРассмотрим на примере дефолтных настроек для обработки карточек товара (роут shop/product/show)
[
{
"class": "app\\properties\\url\\StaticPart",
"static_part": "catalog",
"parameters": {
"category_group_id": 1
}
},
{
"class": "app\\properties\\url\\FullCategoryPathPart",
"category_group_id": 1
},
{
"class": "app\\properties\\url\\ObjectSlugPart"
}
]
Классы для обработки частей урла - наследники \app\properties\url\UrlPart. Остальные свойства - это публичные свойства классов (свойство parameters - объявлено в \app\properties\url\UrlPart). Экземпляры этих классов создаются с помощью Yii::createObject, который и заботится о заполнении свойств.
1 класс - одна часть урла. Они не обязательно должны выполнится все, но обязательно в конце обработки url_template в урле не должно остатся необработанных частей - иначе считается, что этот вариант не подошёл.
StaticPartСтатично заданная часть урла в виде строки. Обычно используется для “разруливания” нескольких групп категорий.
static_part - статичная часть, которая ищется в урле (в примере выше - catalog)CategoryPartНапрямую нигде не используется, но служит в качестве основы для FullCategoryPathPart и PartialCategoryPathPart
category_group_idinclude_root_category - должен ли урл включать в себя корневую категориюFullCategoryPathPartКаждый пришедший слаг, считает слагом категории. Разбирает урл до тех пор, пока он не кончится или для очередного слага не будет подходящей категории.
model_category_attribute - название атрибута, содержащего в себя привязку к категориям. В качестве категории тут может выступать только \app\modules\shop\models\CategoryPartialCategoryPathPartРаботает аналогично FullCategoryPathPart т.к. реализация метода getNextPart находится в общем родителе - CategoryPart. Различия между двумя этими вариантами, только в методе appendPart
Уникальные настройки отсутствуют.
ObjectSlugPartИщет объект (тип объекта указан в качестве object_id в строке с текущим правилом) с помощью метода findBySlug. Ищет только 1 объект и соответственно использует только 1 слаг.
Уникальные настройки отсутсвуют.
\yii\helpers\Url::to(
[
'shop/product/list',
'category_group_id' => $category->category_group_id,
'last_category_id' => $category->id,
]
);
где
category_group_id — группа категории,last_category_id — id категории\yii\helpers\Url::to(
[
'shop/product/show',
'model' => $product,
'category_group_id' => $category_group_id,
]
);
где
model — объект класса Product,category_group_id - id группы категорий\yii\helpers\Url::to(['page/page/show', 'id' => $child->id])
где id - это id нужной старницы