【问题标题】:Symfony default locale without specifying in URLSymfony 默认语言环境,没有在 URL 中指定
【发布时间】:2017-06-02 22:46:29
【问题描述】:

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

/route
/{locale}/route

目前,我可以访问 /{locale}/route 并获得我的看法,但是,/route 返回 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 错误。

【问题讨论】:

  • 我认为以下模式不适用。 /route/{_locale}/route 是两个不同的路由,它们根据定义为 enfr_locale(以及其他)的要求进行匹配。当您定义默认 _locale 时,它只会在生成路由和省略 _locale 参数时帮助您。如果你真的想这样做(我不建议这样做),你可以写一个自定义的RouteMatcher

标签: symfony symfony-routing


【解决方案1】:

您必须定义另一条路线以涵盖没有提供的语言环境的场景,请尝试将您的路线定义更改为:

#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()
    {
        ...
    }
}

【讨论】:

  • 原来你不能在 Controller 类级别应用多个路由,但是,我可以将它应用到 Action 并且它可以按需要工作。
【解决方案2】:

我同意鲍里斯在上面的评论。

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

在我看来,使用像 Athlan 这样的 EventListeners 来做这件事是有办法的。我不会弄乱你自己的 RouteMatcher。 看看 lordrhodos 写了什么,从来没有尝试将这样的两条路由放在一个 Controller 注释中,但我认为如果你只有一个 Controller 是要走的路。如果它们会很多,那么只在一个地方使用 EventListener 可能会更干净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2011-10-29
    • 2016-09-07
    • 2014-03-31
    相关资源
    最近更新 更多