Когда вы определяете параметр в вашем маршруте, 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).