Symfony2 глобальное и необязательное обнаружение локали с маршрута
Здесь я хочу достичь, а затем компиляция знаний, которые я приобрел, без решения.
В проекте Symfony2 без использования выделенного пакета я хочу, чтобы первый каталог в пути определял локаль. Он должен быть необязательным:
Поскольку у меня будет более 100 маршрутов в конце проекта и учитывая, что локали могут быть добавлены в любое время, мне нужно, чтобы вся маршрутизация локали записывалась только один раз.
Невозможно достичь этого с помощью одного файла маршрутизации. Интересным решением из SF2.1 были привязанные файлы маршрутизации, объясненные самим Фабиеном Потеншье: один файл префикс локалей и цепей к нормальной маршрутизации. Здесь мы находимся:
В первом файле перечислены маршруты и цепи, не поддерживающие локали, в файл маршрутизации, поддерживаемый локали, для всех других обычных маршрутов.
- routing.yml:
sys_ajax:
resource: "@SystemAjax/InternalAjax/get"
prefix: /sysajax
locale_routing:
resource: base_routing.yml
prefix: /{_locale}
defaults:
_locale: fr
- base_routing.yml:
user:
resource: "@UserBundle/Resources/config/routing.yml"
prefix: /user
@BTUserBundle/Resources/config/routing.yml является обычным файлом маршрутизации пакетов.
Хорошо, так что работает для URL-адресов с locale в пути (примеры 2 и 3), но маршрут не найден, если я удаляю необязательную локальную часть (пример 1). Легко догадаться, что проблема связана с маркером {_locale}, фиксирующим "пользовательскую" часть URL как локаль, когда в URL нет строки локали. Но тогда как я могу сказать, чтобы URL-адрес не отделил и привязал его к следующему файлу, если первая часть URL-адреса не является en | fr | it | de, например?
Решение с форума состояло в том, чтобы сделать 2 маршрута:
- routing.yml:
sys_ajax:
resource: "@SystemAjax/InternalAjax/get"
prefix: /sysajax
locale_routing:
resource: base_routing.yml
prefix: /{_locale}
requirements:
_locale: fr|en
locale_routing2:
resource: base_routing.yml
prefix: /
defaults:
_locale: fr
В одном правиле есть локальная часть, а другая нет. К сожалению, это не работает, потому что дважды строка resource: base_routing.yml
(по одному для каждого правила), более поздняя переопределенная первая.
Вот я, нет хорошего решения...
Мне нравится Symfony (с 2008 года), но иногда я просто удивляюсь, как простые проблемы могут потребовать очень сложного решения с этой инфраструктурой.
Ответы
Ответ 1
Вы всегда можете справиться с этим с другого направления и использовать достойный редактор с макросами для записи файлов маршрутизации. Вряд ли какой-либо ручной труд, и вы достигнете того, чего хотите. Изменение его будет простым с заменой регулярного выражения и/или макросом.