Маршрутизация Symfony — локаль в качестве субдомена с запасным вариантом по умолчанию

Я пытаюсь настроить систему маршрутизации с поддоменом, представляющим текущую локаль. Маршрутизация устанавливается через @Routing аннотации и выглядит так:

/**
* @Route(
*      "/",
*      name="homepage",
*      host="{locale}.{domain}",
*      defaults={"locale" = "en", "domain" = "%domain%"},
*      requirements={"locale" = "en|de|fr", "domain" = "%domain%"}
* )
*/

Хорошо работает для URL, как en.somedomain.com или же de.somedomain.com, но не может найти правильный маршрут для somedomain.comбез локали.

Я понимаю, что из-за host параметр, который установлен для точного представления locale.domain шаблон, но я не могу найти способ сказать системе маршрутизации Symfony, что могут быть дополнительные, по умолчанию host,

Обыскал все вокруг, но ничего особенного не нашел. Буду признателен за любую помощь!

ОБНОВИТЬ

На самом деле есть способ сделать это, добавив еще один @Route в аннотации, без host параметр:

/**
* @Route(
*      "/",
*      name="homepage_default",
*      defaults={"locale" = "en"}
* )
*/

но это выглядит немного грязно, и я не использую %domain% Параметр там, что для меня важно — скажем, если мне понадобится еще один поддомен для мобильной версии.

6

Решение

Что ж, похоже, маршрутизация с тройной аннотацией для обработки локали + субдомена пока является единственным выбором.

Изучение документации (например, Эта статья) показывает, что разработчики Symfony побуждают нас делать это таким образом, что для меня не очень приятно. Тем не менее, вот решение …

/**
* @Method({"GET"})
* @Route(
*      "/",
*      name="homepage",
*      host="{mobile}.{_locale}.{domain}",
*      defaults={"mobile" = "moblie", "locale" = "%locale%", "domain" = "%domain%"},
*      requirements={"mobile" = "mobile|m", "_locale" = "%locale%|de|fr",  "domain" = "%domain%"}
* )
* @Route(
*      "/",
*      name="homepage",
*      host="{_locale}.{domain}",
*      defaults={"_locale" = "%locale%", "domain" = "%domain%"},
*      requirements={"_locale" = "%locale%|de|fr", "domain" = "%domain%"}
* )
* @Route(
*      "/",
*      name="homepage_default",
*      defaults={"_locale" = "%locale%"}
* )
*/

Обратите внимание, что порядок важен, начиная с поддоменов и заканчивая по умолчанию. Как это выглядит некрасиво @Route аннотации, я решил переписать это в YAML также:

homepage_locale_mobile:
path:      /
host:      "{mobile}.{_locale}.{domain}"defaults:  { mobile: "mobile", _locale: "%locale%", domain: "%domain%" }
requirements:
mobile:  "mobile|m"_locale: "%locale%|de|fr",
domain:  "%domain%"
homepage_locale:
path:      /
host:      "{_locale}.{domain}"defaults:  { _locale: "%locale%", domain: "%domain%" }
requirements:
_locale: "%locale%|de|fr",
domain:  "%domain%"
homepage:
path:      /
defaults:  { _locale: "%locale%" }

Заказал также. Может быть, кто-то встретит и использует это.

5

Другие решения

У меня только что была похожая проблема со значениями по умолчанию, хотя это был параметр маршрута, а не локаль.

Решение было там, чтобы заменить знаки = на: как и должно быть, и компилятор почему-то не жалуется на это.

Так что попробуйте это:

/**
* @Route(
*      "/",
*      name="homepage",
*      host="{locale}.{domain}",
*      defaults={"locale" : "en", "domain" : "%domain%"},
*      requirements={"locale" : "en|de|fr", "domain" : "%domain%"}
* )
*/
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector