(решено) Как делать роутинг?

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
satoved
Сообщения: 14
Зарегистрирован: 2015.10.07, 17:51

(решено) Как делать роутинг?

Сообщение satoved »

Переношу сайт-каталог на Yii2. Одно из требований - сохранение всех URL.

Есть два уровня категорий
/programms
/computers/notebook

И в вхождения в них (скажем, товары):
/programms/123
/computers/notebook/1234

При чем товар может входить в несколько категорий, но его URL генерируется по одной из них (в many-to-many таблице категория-товар есть третья колона - main. Там 1 для одной главной категории и 0 для остальных).

Попробовал сделать:
1) В actionView категории передаются slug'и родительской категории и подкатегории.
2) В actionView товара передаются slug'и родительской категории и подкатегории и ID товара в конце.

Код: Выделить всё

                'cat/<categorySlug:[\w_-]+>/<subcategorySlug:[\w_-]+>/<id:\d+>' => 'photo-item/view',
                'cat/<categorySlug:[\w_-]+>/<id:\d+>' => 'photo-item/view',
                'cat/<category:[\w_-]+>/<subcategory:[\w_-]+>' => 'photo-category/view-by-slug',
                'cat/<category:[\w_-]+>' => 'photo-category/view-by-slug',
Но когда я вывожу список товаров из какой-то подкатегории (скажем, 20 штук на странице), для генерации ссылки на товар приходится запрашивать его категорию (у которой main = 1), и дополнительно ее родителя, если она не корневая.

Т.е. на каждую ссылку на товар - 2 SQL запроса, что не есть хорошо.

Кто как выходил из такой ситуации?

Вижу один вариант - банально закешировать страницы, но не для этого я пробую перейти с drupal на yii :)
Последний раз редактировалось satoved 2015.10.11, 18:44, всего редактировалось 1 раз.

Аватара пользователя
samdark
Администратор
Сообщения: 9355
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как делать роутинг?

Сообщение samdark »

Можно хранить URL-ы вместе с категориями.

satoved
Сообщения: 14
Зарегистрирован: 2015.10.07, 17:51

Re: Как делать роутинг?

Сообщение satoved »

Sam Dark, если в правильно понял, это сведет количество запросов для генерации ссылки на каждого товара до одного (все равно для каждого товара придется просить у SQL главную родительскую категорию).

Я так понял, при такой структуре роутинга, для генерации ссылок на товары не избежать SQL запроса на каждый товар?

Аватара пользователя
samdark
Администратор
Сообщения: 9355
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как делать роутинг?

Сообщение samdark »

Ну да.

satoved
Сообщения: 14
Зарегистрирован: 2015.10.07, 17:51

Re: Как делать роутинг?

Сообщение satoved »

Удалось решить проблему, теперь для генерации ссылок не создается ни одного лишнего SQL запроса, т.е. количество запросов не зависит от количества выводимых ссылок.

Sam Dark навел на мысль - можно хранить URL вместе с категориями. Но тогда все еще нужно делать запрос для каждого вхождения на его родителя и строить путь.

Но можно хранить URL прямо во вхождениях, который будет составлять - %ПУТЬ РОДИТЕЛЯ%/%ID ВХОЖДЕНИЯ
И списывать его в afterSave() модели вхождения в категорию.

Тогда, можно генерировать ссылки прямо по этому полю, не трогая связи вхождений в категорию.

Ответить