Можете ли вы заставить symfony разрешить определенный маршрут?

Скажите, что я должен следовать 2 маршрутам в этом порядке:

Zip:
  url: home/:zip
  param: { module: home, action: results }

State:
  url: home/:state
  param: { module: home, action: results }

и я использую такой маршрут, как:

'@State?state=CA'

Почему он разрешается на Zip-маршрут? Я думал, что когда вы явно указали имя маршрута: '@State', он не анализировал весь файл маршрутизации, а просто использовал конкретный маршрут, который вы запрашивали.

Я хотел бы иметь возможность использовать одно и то же действие для отображения данных на основе имени переменной (zip или состояния). Я не хочу создавать одно и то же действие (результаты) дважды, просто чтобы передать другой параметр.


person Justin    schedule 13.03.2009    source источник


Ответы (3)


Вам нужно добавить требования, чтобы он распознавал разные форматы.

Zip:
  url: home/:zip
  param: { module: home, action: results }
  requirements: { zip: \d{5} } # assuming only 5 digit zips

State:
  url: home/:state
  param: { module: home, action: results }
  requirements: { state: [a-zA-Z]{2} }

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

person Peter Bailey    schedule 13.03.2009
comment
Ах, хорошо... так что на самом деле он не разрешается в имя маршрута, он все еще выполняет некоторый синтаксический анализ - какой тогда смысл в уникальном имени маршрута? - person Justin; 14.03.2009
comment
Мне нужно увидеть больше кода, как вы используете имя маршрута. Я предполагаю, что это помощник представления (например, link_to или url_for), но я не уверен. Кроме того, какая версия symfony? - person Peter Bailey; 14.03.2009
comment
Я использую Symfony 1.2.1, маршрут вызывается из оператора url_for(). - person Justin; 16.03.2009

проблема здесь в том, что оба правила маршрутизации разрешаются в несколько одинаковый URL-адрес (/home/), и при создании ссылок он использует правильный именованный маршрут для создания URL-адреса.

когда вы нажимаете на этот сгенерированный URL-адрес (например, /home/CA) без добавления требований, он будет соответствовать первому правилу в файле routing.yml, которое совпадает, и это ваш маршрут «Zip».

просто объяснить, что происходит.

person deresh    schedule 17.03.2009

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

Добавление requirements: — это путь.

person laurentb    schedule 15.03.2009
comment
Я думаю, там еще есть немного разбора? Я думаю, что если вы укажете конкретное имя маршрута, оно проигнорирует все остальные маршруты и будет использовать только именованный маршрут, поэтому наличие одного и того же URL-адреса не будет проблемой. - person Justin; 16.03.2009