Я пытаюсь настроить систему маршрутизации с поддоменом, представляющим текущую локаль. Маршрутизация устанавливается через @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%
Параметр там, что для меня важно — скажем, если мне понадобится еще один поддомен для мобильной версии.
Что ж, похоже, маршрутизация с тройной аннотацией для обработки локали + субдомена пока является единственным выбором.
Изучение документации (например, Эта статья) показывает, что разработчики 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%" }
Заказал также. Может быть, кто-то встретит и использует это.
У меня только что была похожая проблема со значениями по умолчанию, хотя это был параметр маршрута, а не локаль.
Решение было там, чтобы заменить знаки = на: как и должно быть, и компилятор почему-то не жалуется на это.
Так что попробуйте это:
/**
* @Route(
* "/",
* name="homepage",
* host="{locale}.{domain}",
* defaults={"locale" : "en", "domain" : "%domain%"},
* requirements={"locale" : "en|de|fr", "domain" : "%domain%"}
* )
*/