我需要创建一个包含多个区域设置的应用。每个路由都以区域设置为前缀。例如,xxx.com/en/home
,xxx.com/fr/home
。
问题是,我需要动态地将语言环境字符串绑定到路由前缀。由于用户可以更改区域设置,因此区域设置字符串存储在会话中。我需要参考web.php上的会话。 Session对象不能在web.php的globle范围内使用,这意味着session('key')除了路由函数之外不会在最外层的范围内获取任何东西(null),因为Laravel在实例化任何会话之前解析web.php对象,我想。因此,我面临一个难题,即我不能在web.php的最外层范围内引用会话,而我需要会话来创建动态前缀。我怎么解决这个问题?
答案 0 :(得分:2)
您可以使用以下内容:
Route::prefix(App::getLocale())->middleware('lang')->group(function () {
// Routes
});
Lang中间件:
class Language {
public function handle(Request $request, Closure $next)
{
$locale = $request->segment(1);
if (in_array($locale, config('app.locales'))) {
\App::setLocale($locale);
return $next($request);
}
if (!in_array($locale, config('app.locales'))) {
$segments = $request->segments();
$segments[0] = config('app.fallback_locale');
return redirect(implode('/', $segments));
}
}
}
答案 1 :(得分:1)
我最近使用语言环境为我的路线添加了前缀,我发现使用mcamara's Laravel Localization package很容易实现。设置软件包安装后,我只需要为所有需要的语言环境前缀添加一个路由组。
Route::group([
'prefix' => LaravelLocalization::setLocale(),
'middleware' => ['localeSessionRedirect', 'localizationRedirect']
], function()
{
Route::get('/contact', 'HomeController@contact_page');
});
答案 2 :(得分:0)
我不确定你的情况和你应用程序的复杂性,但我会尝试通过一次生成所有路径来保持简单
$locales = [
'en',
'ru',
];
foreach ($locales as $locale) {
Route::group(['prefix' => $locale], function() {
Route::get('route1',function(){});
Route::post('route1',function(){});
});
} return false;
然后我会编写一个解析语言环境并相应设置的中间件。希望它有所帮助。