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

时间:2017-01-18 13:59:39

标签: symfony symfony-routing

我想配置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错误。

2 个答案:

答案 0 :(得分:4)

您必须定义另一条路线来覆盖没有提供区域设置的方案,请尝试将路线定义更改为:

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

答案 1 :(得分:0)

我同意鲍里斯在那里评论的内容。

关于创建RouteMatcher的另一种解决方案是使用EventListener并将用户重定向到same route with the default Locale(检查具有更多upvotes的答案)

在我看来,像Athlan这样的EventListeners解释说还有很长的路要走。我不会搞砸你自己的RouteMatcher。 只要看看lordrhodos写的是什么,就不要试图在Controller注释中放置这样的两条路径,但我想如果你只有一个Controller就可以了。如果它们将会很多,那么只能在一个地方使用EventListeners来实现这一目标。