Как объединить параметры маршрута в MenuBuidler для функциональности переключателя языка, используя KnpMenuBundle и Symfony3

Вступление

В моем личном проекте я использую:

Настройка

Для настройки я использовал документацию в [2], [3] и примеры кода [4]. Мое меню работает, интеграция между Bootstrap а также KnpMenuBundle тоже работает.

проблема

Для того, чтобы реализовать language switcher, я использую twig шаблоны.

Он отлично работает, но я хотел бы перейти к более масштабируемому подходу, а именно — использовать выделенный пакет (KnpMenuBundle).

В данный момент MenuBuilder производит ужасные URL-адреса (показано в разделе результатов code sample 1). Я хотел бы, чтобы он генерировал ссылки, которые отображаются в разделе результатов code sample 2,

Я не знаю, как этого добиться.

Вопрос

Как создать красивые URL-адреса с помощью MenuBuilder?

Как можно принудительно объединить параметры маршрута в MenuBuilder?

КОД: образец 1

образец моего MenuBuilder

$language['Language']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Language LV', array('label' => 'language.lv', 'route' => 'homepage_lv', 'routeParameters' => array('_locale' => 'lv')))
->setExtra('translation_domain', 'language');
$language['Language']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Language EN', array('label' => 'language.en', 'route' => 'homepage_en', 'routeParameters' => array('_locale' => 'en')))
->setExtra('translation_domain', 'language');
$language['Language']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Language RU', array('label' => 'language.ru', 'route' => 'homepage_ru', 'routeParameters' => array('_locale' => 'ru')))
->setExtra('translation_domain', 'language');

производит следующие ссылки:

изменение локали не происходит

КОД: образец 2

обычный Menu шаблон веточки

<li><a href="{{ path(current_route, app.request.get('_route_params') | merge({'_locale': 'lv'})) }}">{{ "language.lv" | trans({}, "language") }}</a></li>
<li><a href="{{ path(current_route, app.request.get('_route_params') | merge({'_locale': 'en'})) }}">{{ "language.en" | trans({}, "language") }}</a></li>
<li><a href="{{ path(current_route, app.request.get('_route_params') | merge({'_locale': 'ru'})) }}">{{ "language.ru" | trans({}, "language") }}</a></li>

производит следующие ссылки:

на самом деле меняет язык после нажатия на них

КОД: образец 3

соответствующая часть моего routing.yml файл

# redirecting home
homepage:
path: /
defaults:
_controller: 'FrameworkBundle:Redirect:redirect'
route: home
permanent: true

# redirecting home
homepage_lv:
path: /lv/
defaults:
_controller: 'FrameworkBundle:Redirect:redirect'
route: home
permanent: true

# redirecting home
homepage_en:
path: /en/
defaults:
_controller: 'FrameworkBundle:Redirect:redirect'
route: home
permanent: true

# redirecting home
homepage_ru:
path: /ru/
defaults:
_controller: 'FrameworkBundle:Redirect:redirect'
route: home
permanent: true

home:
path:     /{_locale}/home
defaults: { _controller: 'AppBundle:Home:home' }
requirements:
_locale: lv|en|ru

Заключение

Пожалуйста, порекомендуйте.

Спасибо за ваше время и знания.

0

Решение

Похоже, что routes с parameters в MenuBuilder (в отличие от routes в twig шаблоны) не обрабатывает redirects в routing.yml

Это означает, что правильный синтаксис для моего случая:

$language['Language']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Language LV', array('label' => 'language.lv', 'route' => 'home', 'routeParameters' => array('_locale' => 'lv')))
->setExtra('translation_domain', 'language');
$language['Language']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Language EN', array('label' => 'language.en', 'route' => 'home', 'routeParameters' => array('_locale' => 'en')))
->setExtra('translation_domain', 'language');
$language['Language']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Language RU', array('label' => 'language.ru', 'route' => 'home', 'routeParameters' => array('_locale' => 'ru')))
->setExtra('translation_domain', 'language');

И это приводит к красивым URL.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]