Php Laravel 5路由过滤器正则表达式

Php Laravel 5路由过滤器正则表达式,php,laravel,laravel-5,laravel-routing,Php,Laravel,Laravel 5,Laravel Routing,我正在尝试实现一个支持两种语言的laravel网站(pt和en,已经实现了pt回退)。所需的url应为www.example.com/pt/list(葡萄牙语)和www.example.com/en/list(英语)。如果未插入任何语言,则应使用pt作为默认值。 我有以下代码: [routes.php] Route::filter('localization', function() { App::setLocale(Route::input('lang')); }); Route::g

我正在尝试实现一个支持两种语言的laravel网站(pt和en,已经实现了pt回退)。所需的url应为www.example.com/pt/list(葡萄牙语)和www.example.com/en/list(英语)。如果未插入任何语言,则应使用pt作为默认值。 我有以下代码: [routes.php]

Route::filter('localization', function() {
    App::setLocale(Route::input('lang'));
});
Route::group(['prefix' => '{lang?}', 'before' => 'localization'], function() {
    Route::get('/', 'HomeController@index');
    Route::get('/list','ListController@index');
});
当语言被定义时,所有的工作都很好,但否则它将总是重定向到主页,即使这个URL没有路由器。 我怎样才能避免这种行为?可以对一个组执行正则表达式吗?我猜这是《拉威尔4》中唯一的作品

编辑1: 我可以使用htaccess中的重定向来修复它(如果没有语言前缀,那么就使用/pt/prefix进行重定向,但我想肯定还有另一种方法)

编辑2: 可以使用下面的代码修复它,但它还涉及使用重定向,我想这是可以防止的,url将始终具有语言参数

Route::filter('localization', function() {
    $accepted_language = array("pt","en");

    $first_segment = Route::input("lang");
    if(in_array($first_segment,$accepted_language))
    {
        /*ALL GOOD, Language in URL*/
        App::setLocale(Route::input('lang'));
    }
    else
    {
        /*REDIRECT WITH LANGUAGE*/
        $segments   = Request::segments();
        $imploded   = implode("/",$segments);
        $url        = "/pt/".$imploded;
        return Redirect::to($url, 301);
    }

});

在我最近的项目中,我也遇到了同样的问题。您可以这样做:

$languages = array('en', 'pt');
$locale = Request::segment(1);

if (in_array($locale, $languages))
{
    App::setLocale($locale);
}
else
{
    redirect('pt')->send();
}

Route::group(['prefix' => $locale], function()
{
    Route::get('/', 'HomeController@index');
    Route::get('list','ListController@index');
});
或者将区域设置检入单独的中间件