在 URL 中未指定的 Symfony 默认语言环境

Symfony default locale without specifying in URL

我想配置 Symfony locale 选项以便我可以成功访问以下路由:

/route
/{locale}/route

目前,我可以访问 /{locale}/route 并获得我的观点,但是,/route returns No route found for "GET /route"。我的配置如下:

#app/config/parameters.yml
parameters:
    locale: en

#app/config/config.yml
parameters:
    app_locales: en|fr
framework:
    translator: { fallback: "%locale%" }
    default_locale: "%locale%"

#app/config/routing.yml
app:
    resource: '@AppBundle/Controller/'
    type: annotation

我的控制器有以下注释:

#src/AppBundle/Controller/Admin/MyController.php
/**
 *
 * @Route(
 *     "/{_locale}/admin/my",
 *     defaults={"_locale":"%locale%"},
 *     requirements={"_locale":"%app_locales%"}
 *     )
 */
class MyController extends Controller
{
    /**
     * @Route("/", name="admin_my_list")
     * @Method("GET")
     */
    public function listAction()
    {
        ...
    }
}

如果我特别包含 locale,一切正常。如果我排除 locale,我会得到 No route found 错误。

您必须定义另一个路由来覆盖没有提供的语言环境的场景,请尝试将您的路由定义更改为:

#src/AppBundle/Controller/Admin/MyController.php

class MyController extends Controller
{
    /**
     * @Route(
     *     "/admin/my",
     *     defaults={"_locale":"%locale%"},
     *     )
     * @Route(
     *     "/{_locale}/admin/my",
     *     requirements={"_locale":"%app_locales%"}
     *     )
     * @Method("GET")
     */
    public function listAction()
    {
        ...
    }
}

我同意 Boris 在上面的评论。

制作 RouteMatcher 的另一种解决方案是使用 EventListener 并将用户重定向到 same route with the default Locale(检查有更多赞成票的答案)

在我看来,像 Athlan 解释的那样,使用 EventListeners 来做这件事是可行的。我不会搞砸自己制作 RouteMatcher。 看看 lordrhodos 写的,从来没有试过在 Controller 注释中放置两条这样的路由,但我认为如果你只有一个 Controller 是可行的方法。如果他们要很多,那么只在一个地方使用 EventListeners 可能会更干净。