如何使用 KnpMenuBundle 和 Symfony3 在 MenuBuidler 中合并路由参数以实现语言切换器功能
How to merge route parameters in MenuBuidler for language switcher functionality using KnpMenuBundle and Symfony3
简介
在我的个人项目中,我使用:
- XAMPP 与 PHP
v7.1.6
- Symfony
v3.3.6
- KnpMnenuBundle
dev-master / 2.2.x-dev
[link 1], [link 2], [link 3] 以便管理菜单。
- Bootstrap
v3.3.7
- Bootstrap 与 KnpMenuBundle 集成 [link 4]
正在设置
为了设置,我使用了 [2]、[3] 中的文档和代码示例 [4]。我的菜单有效,Bootstrap
和 KnpMenuBundle
之间的集成也有效。
问题
为了实施 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>
生成以下链接:
点击它们后实际上会更改语言环境
代码:示例 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
结论
请指教
感谢您的时间和知识。
所以看起来 routes
和 MenuBuilder
中的 parameters
(与 twig
模板中的 routes
相对)不处理 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。
简介
在我的个人项目中,我使用:
- XAMPP 与 PHP
v7.1.6
- Symfony
v3.3.6
- KnpMnenuBundle
dev-master / 2.2.x-dev
[link 1], [link 2], [link 3] 以便管理菜单。 - Bootstrap
v3.3.7
- Bootstrap 与 KnpMenuBundle 集成 [link 4]
正在设置
为了设置,我使用了 [2]、[3] 中的文档和代码示例 [4]。我的菜单有效,Bootstrap
和 KnpMenuBundle
之间的集成也有效。
问题
为了实施 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>
生成以下链接:
点击它们后实际上会更改语言环境
代码:示例 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
结论
请指教
感谢您的时间和知识。
所以看起来 routes
和 MenuBuilder
中的 parameters
(与 twig
模板中的 routes
相对)不处理 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。