Как объединить параметры маршрута в MenuBuidler для функциональности переключателя языка, используя KnpMenuBundle и Symfony3
Вступление
В моем личном проекте я использую:
- XAMPP с PHP
v7.1.6
- Symfony
v3.3.6
- KnpMnenuBundle
dev-master / 2.2.x-dev
[ссылка 1], [ссылка 2], [ссылка 3] для управления меню. - начальная загрузка
v3.3.7
- Интеграция Bootstrap и KnpMenuBundle [ссылка 4]
Настройка
Для настройки я использовал документацию в [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');
производит следующие ссылки:
- http://127.0.0.1:8000/lv/?_locale=lv
- http://127.0.0.1:8000/en/?_locale=en
- http://127.0.0.1:8000/ru/?_locale=ru
изменение локали не происходит
КОД: образец 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
Заключение
Пожалуйста, порекомендуйте.
Спасибо за ваше время и знания.
1 ответ
Похоже, что 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.