我想要一个以国家/地区为前缀的路线。像这样:
/us/shop
/ca/shop
/fr/shop
我的想法是这样做:
<?php
Route::group([
'prefix' => '{country}'
], function() {
Route::get('shop', 'ShopController@Index');
// ...
});
这很有效。我的问题是,我想为每个子路由自动加载Country
,并且能够从控制器和视图中使用它。
任何提示?
答案 0 :(得分:3)
我提出的解决方案依赖于特定的中间件。
<?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 :(得分:1)
实现此目的的一种方法是使用Request
外观的segment功能:
$country = Request::segment(1);