Как отформатировать внешний URL в Symfony? - PullRequest
0 голосов
/ 06 февраля 2009

Мне очень трудно понять документацию, касающуюся системы маршрутизации Symfony, и мне нужно немного помочь с этим.

Я бы хотел отформатировать внешний URL-адрес, чтобы он выглядел следующим образом ...

MySITE / модуль / иллинойс / Чикагский /

С помощью формы пользователь может выполнять поиск по городу, штату или городу и штату.

Я думаю, что правило маршрутизации будет примерно таким: URL: модуль /: штат /: город

Но что, если искать только город или штат? Symfony erros говорит, что произошла ошибка, поскольку отсутствует один из параметров маршрута.

Как правильно обращаться с этим?

1 Ответ

1 голос
/ 09 февраля 2009

Когда вы определяете параметр в вашем маршруте, Symfony требует, чтобы этот параметр был указан. Итак, в вашем случае,: state и: city должны быть оба указаны в URL.

Если вы хотите сделать один или оба из этих параметров необязательными, вы можете попробовать использовать синтаксис маршрутизации * (без имени). Это будет выглядеть примерно так:

some_route_name:
  url:    /module/*
  param:
    module: module
    action: search

Этот маршрут будет соответствовать URL, которые выглядят следующим образом:

  • / модуль / город / Чикагский
  • / модуль / состояние / иллинойс
  • / модуль / состояние / иллинойс / город / Чикагский
  • / модуль / город / Чикагский / состояние / иллинойс

Я знаю, что это не идеально, потому что "город" и "штат" находятся в URL. Но это самый простой способ сделать то, что вы хотите, с помощью системы маршрутизации Symfony.

Затем в вашем контроллере вы будете перенаправлять на 404, если пользователь не указал город или штат:

$this->forward404Unless($this->getRequestParameter('city') || $this->getRequestParameter('state'));

Если этого недостаточно, у вас есть несколько других вариантов. Если вы используете 1.1 или 1.2, вы можете создать подкласс объекта маршрутизации, чтобы заставить его делать то, что вы хотите. Или вы можете использовать несколько маршрутов, чтобы делать то, что вы хотите (один - / module /: city_or_state, а другой - /module/:state/:city).

...