【发布时间】:2018-08-10 04:09:57
【问题描述】:
我的应用可以使用 url 请求更改语言环境。
Route::get('/setLocale/{locale}', function (Request $request, $locale) {
session()->put('locale', $locale);
App::setLocale($locale);
return redirect('/');
})->name('setLocale');
并且该语言环境字符串将存储在会话中。如果有的话,我使用中间件使用会话数据动态更改语言环境。
public function handle($request, Closure $next)
{
if (session('locale')) {
App::setLocale(session('locale'));
}
return $next($request);
}
问题是web.php 中的App::getLocale() 总是返回默认区域设置,即使区域设置为另一个(因为我可以在网络上看到不同的文本)。
$locale = App::getLocale();
dd($locale); // default locale set in config.php
我尝试使用session('locale'),但它总是返回null。我很确定它是在会话中设置的,因为我可以看到该网站具有该语言环境。
我需要参考语言环境的原因是因为我想根据语言环境生成动态路由前缀。
$locale = App::getLocale();
Route::prefix($locale)->group(function () {
....
});
我想知道这里有什么问题?是不是因为 session 没有在路由之前实例化?
内核.php
protected $middlewareGroups = [
'web' => [
... (default)
\App\Http\Middleware\SetLocale::class,
],
];
所以我 dd() web.php 上的 App::getLocale() 和我的 globle web 中间件, web.php 上的 dd() 首先打印...
所以我在注册任何全局中间件之前调用了 web.php。但是那我怎样才能根据语言环境设置动态前缀???
【问题讨论】:
-
@Wreigh,问题不在于在中间件中设置语言环境,因为它适用于我的情况。问题是我无法在 web.php 中获取 session('locale') 或 App::getLocale() 的正确值...
-
你读过吗?那里的问题似乎与您的问题具有相同的性质。
-
你看到了吗mydnic.be/post/…?你在哪里打电话
App::getLocale()?是在带有上述中间件的路由组内吗? -
@Wreigh App::getLocale();不在任何路由函数中,它位于 web.php 的“最外层”范围内。不在任何函数中...因为我需要在全局范围内定义这个变量,只有这样我才能设置动态前缀。