在Symfony 4中将路由重定向到语言前缀

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Symfony 4中将路由重定向到语言前缀相关的知识,希望对你有一定的参考价值。

从版本4.1开始,Symfony现在可以处理多语言路由,而无需外部插件(https://symfony.com/blog/new-in-symfony-4-1-internationalized-routing)。我已经成功翻译了我的路线并且一切正常,除了当访问根URL(“/”)时,Symfony呈现404错误而不是重定向到语言文件夹,例如“/ en /”。

我做了一些研究,但我发现的大部分内容已经过时了(主要是Symfony 2)。也碰到了这个Symfony 3 Redirect All Routes To Current Locale Version,但对于这样一个简单的问题来说,这似乎是一个令人难以置信的乏味解决方案。

理想情况下,我还想将网址“/ admin”重定向到“/ en / admin”,但如果我无法实现它,我可以忍受它。

这是我的routes / annotations.yaml文件:

controllers:
    resource: ../../src/Controller/
    type: annotation
    prefix:
        fr: '/fr'
        en: '/en'
        de: '/de'

我的翻译.yaml文件:

framework:
#default_locale: '%locale%'
default_locale: 'en'
translator:
    paths:
        - '%kernel.project_dir%/translations'
    fallbacks:
        - 'en'

家庭路线配置:

@Route("/", name="home")
答案

看起来您没有匹配/的路线,可能是因为您的所有路线都以语言代码为前缀。

您可以使用命令行工具进行调试:

php bin/console router:match "/"

如果它成功了它应该返回这样的东西:

 [OK] Route "homepage" matches


+--------------+-------------------------------------------------------------------------------------------+
| Property     | Value                                                                                     |
+--------------+-------------------------------------------------------------------------------------------+
| Route Name   | homepage                                                                                  |
| Path         | /                                                                                         |
| Path Regex   | #^/$#sD                                                                                   |
| Host         | ANY                                                                                       |
| Host Regex   |                                                                                           |
| Scheme       | ANY                                                                                       |
| Method       | GET                                                                                       |
| Requirements | NO CUSTOM                                                                                 |
| Class        | SymfonyComponentRoutingRoute                                                           |
| Defaults     | _controller: AppControllerHomeController::index                                         |
| Options      | compiler_class: SymfonyComponentRoutingRouteCompiler                                   |
+--------------+-------------------------------------------------------------------------------------------+

如果不成功,有多种选择。您可以为“/”路由创建一个侦听器,尝试确定正确的区域设置,然后重定向到正确的区域设置,或者只是始终重定向到您的“主要”语言,例如使用这样的路线:

homepage:
    path: /
    controller: SymfonyBundleFrameworkBundleControllerRedirectController::urlRedirectAction
    defaults:
        path: /en
        permanent: true

编辑澄清:

您的routes / annotation.yaml可能如下所示:

controllers:
    resource: ../../src/Controller/
    type: annotation
    prefix:
        fr: '/fr'
        en: '/en'
        de: '/de'

home_fallback:
    path: /
    controller: SymfonyBundleFrameworkBundleControllerRedirectController::urlRedirectAction
    defaults:
        path: /en
        permanent: true

以上是关于在Symfony 4中将路由重定向到语言前缀的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 4 中将一个路由重定向到 HTTPS,将所有其他路由重定向到 HTTP?

在 symfony 中重定向到“/”路由

CakePHP 中的本地化路由:如何重定向到默认语言

如何在Symfony 4.1中禁用尾部斜杠重定向?

index.php到哪个路由重定向?

Symfony 内核创建 302 重定向而不是使用正确的路由