2016-05-05 2 views
1

Я хотел бы настроить несколько URL-адресов для одного действия в контроллере (для целей интернационализации).Как использовать несколько маршрутов для одного контроллераAction с Symfony3

Согласно этому answer это было, конечно, возможно в Symfony2 для:

  1. Сделать двойной маршрут аннотаций.
  2. Используйте сторонний комплект (например, «BeSimple's»).

Но я с помощью Symfony 3.0.3, который запрещает мне делать это, пока я не изменить название маршрута (пример):

/** 
* @Route("/welcome", name="welcome", defaults={"_locale" = "en"}) 
* @Route("/bienvenue", name="welcomeFR", defaults={"_locale" = "fr"}) 
* @Route("/willkommen", name="welcomeDE", defaults={"_locale" = "de"}) 
*/ 

Но добавив дополнительные «FR/DE» гольцов в маршруты меняют свое присутствие и руины мой URL генерации логики в шаблоне, я вынужден сделать на всех звеньях:

{# homepage example #} 

{% if _locale = 'en' %} 
    {{ path('welcome') }} {# Routes from set only for "en" #} 
{% elseif _locale = 'fr' %} 
    {{ path('welcomeFR') }} {# "fr" only links #} 
{% endif %} {# and so on #} 

Кто-нибудь нашел правильное решение этой проблемы?

ответ

0

После тратить 10 часов на нахождение решения на Symfony3 я сделал эти предположения:

  • Ни один из маршрута трюк с точно таким же " название»не будет работать,

Любой вид, как двойной аннотацию, двойной„routing.yml“импорта, на основе сопоставления хоста дает тот же эффект - только один маршрут является MATC hed, обычно последний. Был бы ("/ willkommen", name = "welcomeDE") в моем примере.

  • Оба i18n пучков не работает на Symfony3 через ограничения контроля версий,

Композитор даже не давайте установить пакет.

  • Locale Слушатель и Loader (Компонент маршрутизации) умирает от кэширования.

Моего решения, чтобы соответствовать «_locale» и передать его в LocaleLoader, чтобы загрузить «routing_en.yml/routing_fr.yml» и т.д. файлы соответственно кэшируются на первый матч на Symfony и после этого, изменение «_locale» не влияет на отображение маршрута.

В заключение

Symfony3, похоже, не поддерживает маршрут «пример» с более чем одним «URL» на всех. Через ограничения и кеширование.

После разочарования я рассматриваю вернуться к Symfony 2.8, понятия не имеет, что указывал мастер Symony для блокирования решения «двойной аннотации», и что их текущего представление на ссылки интернационализации.

Надежды когда-нибудь удастся достичь с помощью S3, так как ссылка i18n является довольно распространенной практикой SEO.

EDIT: Подтверждено, работает как шарм на 2.8.5 с i18n от BeSimple.

1

AFAIK, это предпочтительный способ указать несколько маршрутов на уникальное действие контроллера. Итак, ваша текущая проблема заключается в регенерации текущего пути, в зависимости от того, какой маршрут используется

Возможно, вам не нужно изменять свою логику, если вы используете {{app.request.get ('_ route')}} чтобы получить имя вашей текущей маршрутизации. Таким образом, вы можете использовать:

{{ path(app.request.get('_route')) }} 

UPDATE:

насчет создать действие для каждого маршрута и направление их основного действия языка? Может быть, это не лучшая практика, но может работать нормально

/** 
* @Route("/welcome", name="welcome", defaults={"_locale" = "en"}) 
*/ 
public function welcomeAction() 
{ 
    /* code here */ 
} 
/** 
* @Route("/bienvenue", name="welcomeFR", defaults={"_locale" = "fr"}) 
*/ 
public function welcomeFrAction() 
{ 
    $response = $this->forward('AppBundle:ControllerName:welcome'); 
} 

/* 
* @Route("/willkommen", name="welcomeDE", defaults={"_locale" = "de"}) 
*/ 
public function welcomeDeAction() 
{ 
    $response = $this->forward('AppBundle:ControllerName:welcome'); 
} 
+0

Это сложное и довольно приятное решение, спасибо. Но, к сожалению, он не признает, что другие маршруты также должны быть локализованы (например, маршрут «welcomeAnotherName» не будет определять {«_locale» = «fr»} на всех остальных маршрутах. – Xarvalus

+0

Я изучаю «Компонент маршрутизации», и «Custom Route Loader», может быть, я найду там простое решение для определения набора ссылок с помощью «_locale». – Xarvalus

+0

Я добавил и обновил свой ответ. – Muriano

Смежные вопросы