9

有没有办法创建带有前缀的路由,这样我就可以拥有这样的路由

/articles.html -> goes to listing  Controller in default language
/en/articles.html -> goes to the same controller
/fr/articles.html -> goes to the same controller

我目前的问题是通过这样做:

Route::group(['prefix=>'/{$lang?}/',function(){});

像这样的路线:/authors/author-100.html将匹配前缀 'authors` ,并且肯定没有称为“authors”的语言。

我使用 laravel 5.5

4

4 回答 4

10

似乎没有任何好的方法来使用可选前缀,因为使用“可选”正则表达式标记的组前缀方法不起作用。但是,可以使用所有路由声明一个闭包,并添加一次带有前缀和一次不添加:

$optionalLanguageRoutes = function() {
    // add routes here
}

// Add routes with lang-prefix
Route::group(
    ['prefix' => '/{lang}/', 'where' => ['lang' => 'fr|en']],
    $optionalLanguageRoutes
);

// Add routes without prefix
$optionalLanguageRoutes();
于 2018-02-26T16:15:35.080 回答
9

在可选路由参数上使用 where 正则表达式匹配就足够了:

Route::get('/{lang?}, 'SameController@doMagic')->where('lang', 'en|fr');

您也可以在 Route Group 上执行相同的操作,否则具有此答案中的所有选项显然有效。

显示前缀使用的更新:

Route::group(['prefix' => '{lang?}', 'where' => ['lang' => 'en|fr']],function (){
    Route::get('', 'SameController@doNinja');
});

就我而言,即使没有 lang 以及有一个 lang,这也应该足够了,只是也许这组可能会排在其他路线之前。

于 2017-09-04T08:01:12.220 回答
1

您可以使用表格来定义接受的语言,然后:

Route::group([
    'prefix' => '/{lang?}',
    'where' => ['lang' => 'exists:languages,short_name'],
], function() {

    // Define Routes Here
});
于 2017-09-04T08:03:20.497 回答
0

另一个可行的解决方案是创建一个语言数组并对其进行循环:

$langs = ['en', 'fr', ''];

foreach($langs as $lang) {
  Route::get($lang . "/articles", "SomeController@someMethod");
}

当然,这会降低您的路线文件的可读性,但是您可以使用它php artisan route:list来清楚地列出您的路线。

于 2019-04-25T20:43:26.190 回答