Laravel 4中基于URL的区域设置检测

时间:2013-05-31 14:18:02

标签: laravel laravel-4

在Laravel 3中,我曾经根据请求网址的第一段检测到区域设置。

application/config/application.php

/*
|--------------------------------------------------------------------------
| Supported Languages
|--------------------------------------------------------------------------
|
| These languages may also be supported by your application. If a request
| enters your application with a URI beginning with one of these values
| the default language will automatically be set to that language.
|
*/

'languages' => array(
    'en',
    'de',
    'fr',
),

所以我可以定义一条路线

Route::get('foo', function() {
    echo 'Foo';
});

并通过以下方式访问:

GET /en/foo
GET /de/foo
GET /fr/foo

Laravel 4删除了此功能。

我可以恢复这种行为吗?

我试图手动实现它,但由于我想在每个请求中使用它,我不想在每个路由中指定语言变量(上面的路由应该与我的实现一起使用)。这是我的解决方案:

App::before(function($request)
{
    $language = Request::segment(1);

    if(in_array($language, Config::get('cms.available_languages')))
    {
        App::setLocale($language);
    }

    // Since locale is already set, 
    // I want to remove the language from the request URL (/en/foo => /foo)
    // So I can route via Route::get('foo', ...)
    $request->removeSegment(1);
}

但是我不知道从请求URL中删除语言,所以我得到404,因为没有指定en / foo。

我可以改变什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

请参阅此论坛帖子:http://forums.laravel.io/viewtopic.php?id=7458

在这里,我们只是通过选择URI前缀,然后将其应用于group Route来检测语言。

然后,要为您的视图编译这些URL,您只需使用命名路由。

对我而言,这是目前最好的解决方法。