А что насчет нормального ЧПУ? (есть проблемы)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: А что насчет нормального ЧПУ?

Сообщение S c » 2013.11.12, 00:47

не пойму как тема вообще к yii2 относиться?

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.11.12, 09:11

S c писал(а):не пойму как тема вообще к yii2 относиться?
Я спрашивал насчет этих возможностей в Yii2, чтобы самому глубоко не копая код, понять как дела обстоят с чпу в yii2, т.к. еще не поздно пожелания к фреймворку оставлять.
Доков по этому моменту еще нет, так что доки дали на версию yii1, может не изменилась логика эта, не знаю.

Из того что понял, тот вариант со slug, что Александр показал, для меня отметается сразу. Это больше как подделка, может на каком то простом сайте и можно применить, но в общем случае не подойдет.
Насчет создания того правила, уже ближе.
Мне как бы нужно одно правило общее для всех действий сайта, а не как в примере класса правила, там где внутрь захардкодена проверка на роут. Это о чем я изначально интересовался.

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

Re: А что насчет нормального ЧПУ?

Сообщение samdark » 2013.11.13, 09:46

Не понимаю, почему вариант со slug не подходит:

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

$this->createUrl('site/page', ['id' => $page->id]);
//vs
$this->createUrl('site/page', ['slug' => $page->slug]);
Это единственное отличие. Да, конечно, на 4 символа длиннее, но зато внутри гораздо проще.

По правилам и классам для них, действительно, с 1.1 мало что изменилось.

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.11.13, 10:43

$page - это у вас некая модель из базы? AR объект.
У этого варианта следующие недостатки:
1) Предполагается что slug - это св-во модели $page и хранится соответственно в таблице модели.
Но так ли эта seo чепуха должна храниться в привязке к модели?
В общем то случае этот slug может отличаться в зависимости от текущего языка сайта.
Получается что для каждой модели это надо повторять.
И в контроллерах делать вручную везде проверку на существование.
Я бы не хотел постоянно в контроллерах делать эту проверку.
Я хочу в контроллере работать чтобы ему не надо было знать о каких то ЧПУ.
2) Ссылку вы создаете тоже вручную, подгрузив сначала модель.
А если ссылку нужно создавать автоматически? (Ее адрес вводится в админке а createUrl должен выдать чпу адрес)

Я нацеливаюсь на то как храняться эти алиасы в цмс с которыми я работал.
Таблица Алиасы

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

source                                  |  alias
----------------------------------------------
site/page?id=1                      | stranica1
site/page?id=2                      | stranica2
article/view?cat=2&model=4  | audi
article/view?cat=3&model=7  | volvo
Поэтому и задачи 2:
1) При запросе на страницу по алиасу идет поиск в табл, если есть соответствие, то достает роутер и нужные гет переменные и вперед.
2) При любом createUrl('site/page', ['notid' => 8, 'id' => $page->id]); должно проверить на наличие синонима.
Но искать в таблице Алиасов совпадение - по каким гет переменным для данного роутера искать - вот в чем вопрос.

Записал себе на потом смотреть полностью реализацию urlmanagement, может там есть простой выход, который я пока не вижу.

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: А что насчет нормального ЧПУ?

Сообщение S c » 2013.11.13, 11:29

1) нет нечего страшного, чтоб хранить slug в таблице. если это мультиязычный сайт - slug меняться не должен. обычно добавляют что то типа site.com/de/slug_testoviy/

2) да, так же можно отдельно в map таблице хранить slug-и для всех страниц. и так же доставать. Зато в админке всем этим очень легко будет управлять.

вот первый вариант к примеру реализован тут http://www.free-lancing.ru/project/2294 ... angliyskiy

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.10, 12:11

Что делать и как быть с реальной бедностью роутера в Yii?
Изучил внутренности urlManager и его правил и понял что решения так и нет.
Вся проблема в том что приходиться писать так:

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

$this->createUrl('site/page', ['id' => $page->id, 'notimportant'=>9]); 
вместо:

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

$this->createUrl('site/page/' . $page->id, ['notimportant'=>9]); 
Т.е. если я даже своим URL правилом буду создавать выходящие урлы как синонимы из базы, я не имею информации об роуте страницы. А имею информацию только об роуте контроллера+действия.
Я не смогу сделать запрос вида

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

SELECT alias from table_aliases where url= 'site/page?id=1' 
потому что я не буду знать какие гет переменные надо добавить к контроллеру/действию чтобы получить роут текущей страницы.
Это ужасно, что yii так странно забило на понятие Страница сайта.
Страница сайта - это не Контроллер/действие.
Контроллер/действие - это глагол - что делать.
А необходимый параметр для Страницы - это над чем произвести действие.

А в yii такую важную вещь вообще не учли, и достают параметры в самом конце:
https://github.com/yiisoft/yii2/blob/ma ... er.php#L46
и получается что только внутри контроллера ты и можешь знать что же это за страница.

Как я например из одного контроллера создам через $this->createUrl( указав тут естественно внутренний путь) синонимичный путь на другой контроллер? Откуда этот контроллер может знать какой для этого нового действия дополнительный гет параметр? :cry:
В drupal , там нет такой проблемы, и вся возня с синонимами сконцентрирована в паре десятков строчек кода на верхнем уровне.
Не спец по Kohana, но глянул и вижу что и там нет данной проблемы.

Как вообще можно было так это спроектировать?
Такую суперскую вещь для удобного менеджмента ЧПУ (ЦЕНТРАЛИЗОВАННО) получается не учли.
Зато целое иероглифическое письмо для правил класса UrlRule изобрели. (от которых в общем случае мало толку, это статика)


Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.11, 11:30

Спасибо за ответ. Но вы не поняли сути вопроса.
Я вроде подробно же описал.
Синонимы и их соответствия хранятся в ОДНОЙ ТАБЛИЦЕ.

Ваши советы касаются:
1) для каждого пути свое правило. Ну ладно тут можно еще как то динамически накатить правила. Но это 100% неэффективно. Т.к. правила исполняются одно за другим и пока нужное найдется 10 запросов к разным таблицам произойдет

2) хардкодить в ручную для каждого соответствия внутри одного правила. Вариант нерабочий для сайтов , которые без постоянной поддержки программиста. Да и вообще это дополнительный неудобный труд.

yan
Сообщения: 940
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: А что насчет нормального ЧПУ?

Сообщение yan » 2013.12.11, 13:03

выше уже дали ссылку http://www.yiiframework.com/doc/guide/1 ... .url#sec-9 - делаем свое правило и как угодно разруливаем

Аватара пользователя
ElisDN
Сообщения: 5267
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: А что насчет нормального ЧПУ?

Сообщение ElisDN » 2013.12.11, 13:24

Ответил в комментарии снова. Как раз одно правило на весь сайт.

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.11, 14:22

yan писал(а):выше уже дали ссылку http://alu5.sgxi1v6hzn3zo6e.qjtv.e/doc/ ... .url#sec-9 - делаем свое правило и как угодно разруливаем
Капитан, я про то и спрашивал - как бы с помощью своего правила это и можно было бы сделать.
"Как угодно" разрулить с помощью своего волшебного правила не получается. Если бы ты попробовал прочитать и подумать хоть чуть чуть о чем я выше писал, то не нес бы глупости, уверовавший(а не разобравшийся в сути данного механизма) что свое правило спасет от всех бед.

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.11, 14:28

ElisDN писал(а):Ответил в комментарии снова. Как раз одно правило на весь сайт.
Я говорю о том, что не могу узнать и сопоставить название параметра, а вы мне советуете его переименовать....
Давайте я стану самым ГЛАВНЫМ и дам всем указание , про то какие имена и в каком порядке использовать. И проблема будет решена.
Итак ВСЕМ, ВСЕМ, ВСЕМ, в аргументах action действий, можно использовать только имена параметров - $one, $two, $three,... Все расширения, все модули, все что кидается на package.org, все должны подчиняться этому правилу. :mrgreen:

Аватара пользователя
ElisDN
Сообщения: 5267
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: А что насчет нормального ЧПУ?

Сообщение ElisDN » 2013.12.11, 14:58

Tommi писал(а):Я говорю о том, что не могу узнать и сопоставить название параметра...
Итак ВСЕМ, ВСЕМ, ВСЕМ, в аргументах action действий, можно использовать только имена параметров - $one, $two, $three,...
Ответил вам про рефлексию и сериализацию http://www.elisdn.ru/blog/48/routing-in ... urlmanager

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.11, 15:02

Я уже видел. Но это не решение, там я ответил почему.

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.11, 16:09

Хорошо что хоть один человек все таки понял в чем проблема.

Продублирую user-case, чтобы предупредить других, что есть такая проблема. А то мужики то и не знают.

Тут все из-за того что роут состоит только из [модуля/]контроллера/действия.
Странно, что никто этого раньше не замечал.
Все наверное наивно надеялись на магию иероглифического письма для настройки UrlManager. А магия там не особо помогающая.
Даже вон по примеру из блога ElisDN про создание своего правила PageUrlRule очевидна эта проблема:
Если такое управление адресом ОТ КОРНЯ будет требоваться для разных роутов то придется создавать свои правила типа - PageUrlRule - NewsUrlRule , UsersUrlRule и т.д.
И если эти УРЛ правила будут искать , как у вас сделано, каждый в своей таблице, то не факт же что первое правило найдет соответствие. Станет работать второе, третье...
А это все множество излишних запросов к базе. Что непозволительно.
Выход один - одна таблица для синонимов для всего сайта.
Распарсить запрос становиться легко и просто - всего один запрос к базе.
А для создания ссылок уже и приходим к моей проблеме.

Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: А что насчет нормального ЧПУ?

Сообщение vova07 » 2013.12.11, 17:34

Я думаю чтоб все было по честному, вам нужно опубликовать здесь ваши мысли касательно решения данной проблемы. Не нужно приводить демо коды и все такое, просто опишите логику которая позволило бы сделать роутинги идельными.

На текущий момент как решение данной проблемы, с учетом того что есть, может быть кэширование выборки роутов, или дополнительная переменная и её кэширование в своём классе с правилами маршутизации.

Описание логики:
- Для всех роутов используется одна таблица. В ней есть ЧПУ путь, и програмный путь. (Дополнительные поля по желанию.)
- В момент парса роута, делается один запрос в базу, как вы выше заметили. (Тут проблем нет.)
- Создания роута заключается примерно в следующем:
а) В нашей моедли которая управляет таблицей роутов, создается статический метод, который выбирает все записи и кешируют их если кэш пустой. (Кэш нужно всегда сбрасывать в момент обновления\создания нового роута)
б) В момент создания роута используется кэш модели что мы реализовали выше, что позволит избавится от лишних запросов вообще, если есть кэш, или обойтись одним запросом когда мы его впервые заполняем.
в) Если не хочется привязыватся к методу модели, можно в своём классе маршрутизации добавить приватный атрибут, и в момент вызова первой функции создания урла, заполнять атрибут доступными правилами, таким образом сократить количество запросов к БД до 1 в случае отказа от кэша.

Tommi
Сообщения: 75
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi » 2013.12.12, 14:52

vova07 писал(а):Я думаю чтоб все было по честному, вам нужно опубликовать здесь ваши мысли касательно решения данной проблемы. Не нужно приводить демо коды и все такое, просто опишите логику которая позволило бы сделать роутинги идельными.
Нет проблем. Хочу тоже чтобы все было по честному.
Примерный план действий.
1) Отменить понятие Контроллер по умолчанию
2) Отменить понятие Действие по умолчанию
2.5) Для Главной страницы (это когда роут в пути пустой), роут берется из Конфига
3) Ввести понятие Параметры
4) Роут становится такой:
?r=модуль/путь_к_контроллеру/действие/параметр1/параметр2/...
5) Действие будет объявляться так:

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

public function actionView($arg1, $arg2 = 'default', $page = 0)
{
// $arg1 == параметр1
}
6) РАЗБОР входящего запроса фреймворк:
- будет знать абсолютно ТОЧНО(!!!!!!) где начинаются параметры и выпарсит их в массив $ARG = [1 => параметр1, 2 => параметр2,... ]
- при биндинге данных в параметры действия:
- те, параметры, которые именуются по шаблону '/arg\d/' ядро фреймворка наполнит из массива $ARG.
- для остальных, как и сейчас , из $_GET
- значения по умолчанию без изменений
- дальше без изменений
7) Создание URL:

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

/*
Контроллер - museums
Действие - view
*/
$this->createUrl('museums/view/1/best');
$this->createUrl('museums/view/1/all', ['page' => 1] );
При этом уже в начале выполнения скрипта, я буду знать что у нас за Текущая страница
( при нечистых ссылках из ($_GET['r'] == 'museums/view/1/best')
И смогу вообще по всему сайту оперировать с понятием Страница сайта.
Виджет показать только на определенной странице сайта? На 'museums/view/1/best'? Да, пожалуйста, вот мы на ней.
Последний раз редактировалось Tommi 2013.12.13, 08:54, всего редактировалось 1 раз.

Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: А что насчет нормального ЧПУ? (есть проблемы)

Сообщение vova07 » 2013.12.12, 16:28

Если честно не могу понять чем отличается логика описаная выше, от того что есть сейчас. То что вы описали в пунтке 3, 4, и 5 уже есть в фрейме, и именно так и работает. (Кроме как то что вид параметров нужно через роуты прописывать чтобы получить такой вид).

Разбор и создание ссылок, вроде без проблем можно реализовать на том что есть.
Касательно понятия, страница сайта, это тоже реализуемо, не могу понять в чем проблема. А вывод виджета, на определенной странице, дело техники.

Я сегодня как раз начал делать так называемый модуль "структуры сайта", для одного маленького проекта на Yii 2. Хочу заметить что за счёт одной таблицы с ЧПУ ссылками, своего класса роутов и одного запроса в базу, можно спарсить, и создать все ссылки для запрашиваемой странице. Это один запрос который в случае необходимости можно и закэшировать, но который позволяет реализовать все то что вам нужно. Или я что-то не понимаю в данной ситуации?

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: А что насчет нормального ЧПУ? (есть проблемы)

Сообщение S c » 2013.12.12, 19:29

создается впечатление, что уважаемый Tommi просто не разобрался еще в yii

Ответить