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

Posted

技术标签:

【中文标题】Laravel 5 路由过滤器正则表达式【英文标题】:Laravel 5 Route filter regex 【发布时间】:2015-09-13 07:55:45 【问题描述】:

我正在尝试实现一个支持两种语言的 laravel 网站(pt 和 en 已经实现了 pt 后备)。所需的网址应该是葡萄牙语的 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 的路由器,它也会始终重定向到主页。 我怎样才能避免这种行为?是否可以对组进行正则表达式?猜猜Jason Lewis' Enhanced Router 仅适用于 Laravel 4

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

编辑 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);
    

);

【问题讨论】:

【参考方案1】:

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

$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');
);

或者将语言环境检查移到单独的中间件中。

【讨论】:

以上是关于Laravel 5 路由过滤器正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中使用正则表达式路由前缀?

Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词

Laravel 时间正则表达式

java正则表达式

自定义价格过滤器的正则表达式

js入门5-字符的查询与过滤 加上使用正则表达式