1

Тема: Segment_separator "-"

Требуется в урл впихнуть информация об :id и :slug, если явно указывать сепаратор _, то ничего не работает  :

release:
  url: /releases/:id_:slug.html
  options: { model: MRelease, type: object }
  param: { module: release, action: show }
  options: { segment_separators: [/,.,_] }

По этому поводу есть такая интересная тема :
Underscore as a segment_separators in routing.yml - Stack Overflow

Так что сегмент-сепаратор _ не работает по умолчанию.
В :slug все пробелы заменяются на -, если его делать сегмент-сепаратором, то все ссылки создаются, но правило роутинга не срабатывает и id со слагом не определяются.

404 | Not Found | sfError404Exception
Empty module and/or action after parsing the URL "/releases/1-some-new-release.html" (/).

Если сделать сепаратором что-то вроде "+", то все начинает работать(создание ссылок + роутинг.)

Можно ли как-нибудь заставить работать роутинг с сепаратором "-"?

Отредактировано QoSyS (2010-07-09 12:54:54)

2

Re: Segment_separator "-"

Можно сделать, чтобы в :slug все пробелы заменились андерскорами, но это не вариант.

3

Re: Segment_separator "-"

какой нужен разделитель?
минус -
или
нижний подчерк _

с минусом проблем быть не должно, а вот подчерк лучше не использовать

release:
  url: /releases/:id-:slug.html
  options: { model: MRelease, type: object }
  param: { module: release, action: show }
  options: { segment_separators: [ /, ., -] }

4

Re: Segment_separator "-"

C минусом будут проблемы, если он встречается в слуге. Потому что тогда он будет расцениваться там как разделитель, со всеми вытекающими. Чтобы не было проблем - надо реплейсить или енкодить символы разделителей в сегментах.
Это проблема даже не роутинга, а логическая.
Если мы делим урл по "/", то совершенно логично, что встретив в каком-либо из сегментов этот символ - обработчик без сомнений разделит его на два, и мы получим уже совсем другую маску - сегментов станет больше, и содержать они будут некорректные данные.
Хотя конечно будь роутинг чуть поумнее - он бы еще при генерации роута заматерился на наличие невалидных символов в данных, а при определенных настройках - и реплейснул бы их на другие, допустимые.
Причем, если подсунуть символ "/" в какой-нибудь сегмент, то Симфони автоматически его заенкодит, а вот если указать "-", то она оставит все как есть, не смотря на то, что он указан в списке разделителей в роуте. Недоработка.

Итого, если хочется чтобы пробелы в слуге показывались как "-", то ничего не выйдет с аналогичным сепаратором. Это не Симфони виновата, это просто нелогично. Либо другой символ в сепараторе, либо полное исключение символа "-" из сегментов.

5

Re: Segment_separator "-"

Ты в общем прав, но с разделителем минус (-) работает и слаги в том числе, даже в первую очередь слаги, да еще необходимо небольшой допил чтоб убирать удвоение (-) когда встречается минус с пробелом.

пример реализации http://www.langwhich.com/sprachschulen/ … 48-p1.html

6

Re: Segment_separator "-"

default/smile Да, я не до конца правильно описал поведение.
Принцип в общем прост. Разделители из указываемого набора применяются не во всем роуте, а согласно маске. Т.е. если сегмент с последующим сегментом разделяется определенным разделителем (например -), то этот самый разделитель, обнаруженный в нем самом, неизбежно вызовет ошибку роута.
Наглядно на твоем же примере:
:part1/:part2/:part3/ -> ...sprachschulen/inlingua-Sprachschule-Ingolstadt/search/...
поскольку "inlingua-Sprachschule-Ingolstadt" - это в маске один сегмент (part2) и он разделен слешами, в нем допустимы любые валидные в урл символы, кроме слеша.
Если мы напишем в маске :part1/:part2-:part3/, то роут у нас примет вид
...sprachschulen/inlingua-Sprachschule-Ingolstadt-search/...
И совершенно очевидно вызовет ошибку, поскольку тогда роутеру становится непонятно, по какому из 4-х "-" его делить и как матчить.
Костыли конечно в некоторых случаях написать можно, например если один из сегментов - число. Тогда в нем точно не может быть знака "-". Но это усложняет анализатор и делает поведение роутов менее предсказуемым, поскольку если у нас в приложении 200+ роутов, сложно отследить, чтобы они не пересекались в каких-то случаях с такими неявными разделителями.

Отредактировано relo_san (2010-07-13 17:22:14)