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

Вы всегда можете справиться с этим с другого направления и использовать достойный редактор с макросами для записи файлов маршрутизации. Вряд ли какой-либо ручной труд, и вы достигнете того, чего хотите. Изменение его будет простым с заменой регулярного выражения и/или макросом.