如何在 MenuBuidler 中使用 KnpMenuBundle 和 Symfony3 合并路由参数以实现语言切换器功



简介

在我的个人项目中,我正在使用:

  • XAMPP with PHPv7.1.6
  • Symfonyv3.3.6
  • KnpMnenuBundledev-master / 2.2.x-dev[链接 1]、[链接 2]、[链接 3] 以管理菜单。
  • 引导v3.3.7
  • Bootstrap 和 KnpMenuBundle 集成 [链接 4]

建立

为了设置,我使用了 [2]、[3] 中的文档和代码示例 [4]。我的菜单正在工作,BootstrapKnpMenuBundle之间的集成也有效。

问题

为了实现language switcher,我正在使用twig模板。

它工作正常,但我想转向更具可扩展性的方法 - 即 - 使用专用捆绑包(KnpMenuBundle(。

目前,MenuBuilder会产生丑陋的URL(显示在code sample 1的结果部分中(。我希望它生成code sample 2的结果部分中显示的链接。

我不知道如何做到这一点。

问题

如何使用MenuBuilder生成漂亮的URL?

如何在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>

产生以下链接:

  • http://127.0.0.1:8000/lv/home
  • http://127.0.0.1:8000/en/home
  • http://127.0.0.1:8000/ru/home

单击它们后实际上会更改区域设置

代码:样本 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

结论

请指教。

感谢您的时间和知识。

看起来,MenuBuilder中带有parametersroutes(而不是twig模板中的routes(无法处理redirectsrouting.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');

它会产生漂亮的网址。

最新更新