Laravel 5路由前缀

8
我希望有一个以国家为前缀的路由。就像这样:

/us/shop
/ca/shop
/fr/shop

我的想法是这样的:

<?php

Route::group([
    'prefix' => '{country}'
], function() {
    Route::get('shop', 'ShopController@Index');
    // ...
});

这个代码可以正常工作。我的问题是,我想自动加载每个子路由的Country并能够在控制器和视图中使用它。

有什么提示吗?


那些国家的语言不也会有所不同吗? - dan-klasson
@dan-klasson 这更像是一个通用问题,但我们可以假设他们会这样做。 - greut
1
为什么不直接使用Laravel本地化呢? - dan-klasson
2个回答

6
我想到的解决方案依赖于特定的中间件。
<?php

Route::get('', function() {
    return redirect()->route('index', ['language' => App::getLocale()]);
});

Route::group([
    'prefix' => '{lang}',
    'where' => ['lang' => '(fr|de|en)'],
    'middleware' => 'locale'
], function() {

    Route::get('', ['as' => 'index', 'uses' => 'HomeController@getIndex']);

    // ...

}

以及中间件。

<?php

namespace App\Http\Middleware;

use App;
use Closure;
use View;

class Localization {
    public function handle($request, Closure $next) {
        $language = $request->route()->parameter('lang');

        App::setLocale($language);

        // Not super necessary unless you really want to use
        // number_format or even money_format.
        if ($language == "en") {
            setLocale(LC_ALL, "en_US.UTF-8");
        } else {
            setLocale(LC_ALL, $language."_CH.UTF-8");
        }

        View::share('lang', $language);

        return $next($request);
    }
}

正如你所猜测的那样,这段代码是为瑞士应用程序而设计的,因此到处都有“_CH”代码。

1

实现这个的一种方法是使用 Request 门面的 segment 函数:

$country = Request::segment(1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接