【问题标题】:Silex optional locale routeSilex 可选语言环境路由
【发布时间】:2013-05-21 13:43:06
【问题描述】:

我可能以错误的方式处理这个问题,所以我愿意接受替代方案。

我只想使用单个路由匹配以下示例 url:

/

/welcome
/en/welcome
/fr/welcome

/my/arbitrarily/deep/path
/en/my/arbitrarily/deep/path
/fr/my/arbitrarily/deep/path

这是我目前所拥有的:

$app->get('/{_locale}{path}', function (Request $request) use ($app) {
    $path = $request->attributes->get('path');
    // do stuff with path here
})
->value('_locale', 'en')
->assert('_locale','^(en|fr)?$')
->value('path', 'index')
->assert('path', '.*')
->bind('*');

现在这似乎按预期工作,但是当我尝试使用 twig path() 或 url() 时,它无法构建正确的 url,例如:#

on /foo(在 url 上没有指定语言环境,因此默认为 en):

{{ path('*', {path:'foo/bar'}) }}

将正确导致

foo/bar

在 /fr/foo 上,同样的调用:

{{ path('*', {path:'foo/bar'}) }}

结果

frfoo/bar

这是因为 {_locale} 和 {path} 之间缺少 /,而是通过将路由更改为:

/{_locale}/{path}

它停止匹配 /foo 并且只匹配 /en/foo、/fr/foo 或 //foo。

我不知道从这里去哪里:s

我不想使用多条路由(可能有或没有{_locale}),因为我不确定它如何与 path() 函数一起使用,我基本上希望 path() 的结果包括如果不是“en”,则为 url 中的当前语言环境(我认为这就是我的意思)。

谁能帮我解决这个问题?

干杯

托比

【问题讨论】:

    标签: locale twig silex


    【解决方案1】:

    /{_locale}/{path}/{path} 声明一个路由。

    至于 path() ,由于您为第一个 route 定义了默认 _locale 值,因此您的视图中应该没有任何问题。

    【讨论】:

    • 这已经部分解决了这个问题,我添加了一个没有绑定的新路由 /{path} 所以 path() 函数总是使用 /{_locale}/{path} 路由生成 url。唯一的问题是,因为它使用了魔法 _locale,所以当使用 path() 生成 url 时,它总是包含“en”(即我转到 /foo 并且页面上的所有链接都是 /en/foo/bar) .鉴于我使用 _locale 进行翻译,看起来我可能需要一个 Twig 辅助函数来处理这个条件“en”而不是使用 path()。
    • 我是程序员,我很懒。不要告诉我我必须做多余的工作:自动化是我们所做的。 Symfony2 解决了这个问题,我不明白为什么 Silex 也不能解决。
    • @ChocoDeveloper 然后回答问题或击败它。我做了,你没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2020-03-29
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多