为我的URL架构寻找Symfony(4)路由操作的最佳实践。 让我们说我正在检测GEO IP并为网络用户显示不同的语言,即使在URL中也是如此。 那么最佳做法是开发路由?
链接示例, 当用户来自美国时:
example.com/static_link_in_en/additional_static_element_in_en/special_static_element_in_en/extra_static_attribute_in_en
example.com/product_name_in_en/additional_element_of_product_in_en/special_element_for_this_item_in_en/extra_attribute_in_en
当用户来自法国时:
example.com/static_link_in_fr/additional_static_element_in_fr/special_static_element_in_fr/extra_static_attribute_in_fr
example.com/product_name_in_fr/additional_element_of_product_in_fr/special_element_for_this_item_in_fr/extra_attribute_in_fr
另一个,也许更好的例子:
example.com/tag - static route, generates a tag cloud in EN
example/tag/ - static route, but displays an error or 404 page, because we are not searching in the database with an empty string in EN
example.com/tag/red - searching in the database with keyword 'red'
example.com/tag/blue - exceptional keyword, we have reserved tag 'blue' so the script will not be searching in the database, the static route will be used in EN
用法语翻译的相同动作:
example.com/marque
example.com/marque/
example.com/marque/rouge
让我们说URL深层次最多可以有10个元素,任何建议?
答案 0 :(得分:3)
更好的策略是在URL中包含区域设置。路由系统使用特殊的_locale参数完全支持这一点。
# config/routes.yaml
contact:
path: /{_locale}/contact
controller: App\Controller\ContactController::index
requirements:
_locale: en|fr|de
在路径中使用特殊的_locale参数时,匹配的区域设置会自动在Request上设置,并且可以通过getLocale()方法检索。换句话说,如果用户访问URI / fr / contact,则语言环境fr将自动设置为当前请求的语言环境。
现在,您可以使用区域设置创建应用程序中其他已翻译页面的路径。
来源:https://symfony.com/doc/current/translation/locale.html
Symfony不支持根据用户语言定义具有不同内容的路由。在这些情况下,您可以为每个控制器定义多个路由,每个支持的语言一个;或使用社区创建的任何捆绑包来实现此功能,例如JMSI18nRoutingBundle和BeSimpleI18nRoutingBundle。
来源:https://symfony.com/doc/current/routing.html#translating-routes