我在Laravel 5.2应用程序中使用了2种语言。我目前正在实施一个简单的密码提醒页面,由于我不知道的原因,我在使用正确的语言发送新密码电子邮件时遇到了问题。
假设我看到德语页面。在页面视图中,我使用Facades:
回显2个值echo App::getLocale();
echo Session::get('locale');
该页面以德语提供,因此两个值都会回显de
。
现在,我在表单中输入一个电子邮件地址并提交。输入到达控制器方法并调用库以向用户发送新密码:
public function resetPassword() {
// Validate the input, retrieve the user...
Mailer::sendNewPasswordEmail($user); // Call to the library sending emails
}
最后,在库中,我var_dump相同的2个值,如下所示:
public static function sendNewPasswordEmail($user) {
var_dump(App::getLocale());
var_dump(Session::get('locale'));
die;
}
在这种情况下,Session::get('locale')
仍然等于de
,但App::getLocale()
显示en
。
为什么,为什么,为什么?
在我的电子邮件模板中,我正在使用Blade的@lang()
指令。据我所知,该指令检查应用程序区域设置以确定要提供的转换。在我的情况下,电子邮件总是以英文发送,我不知道为什么App::getLocale()
在视图中和我正在进行的下一个POST请求中返回不同的值。
这不是第一次发生这种情况,顺便说一下。有时看来,视图“了解”实际的应用程序区域设置,而不是控制器,模型或库。混乱。
想法?
答案 0 :(得分:5)
Laravel 5.2 App_Locale不是持久性的。我发现使语言环境正常工作的唯一方法是创建一个调用App :: setLocale()的中间件:
<?php namespace App\Http\Middleware;
use Closure;
use Session;
use App;
use Config;
class Locale {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
App::setLocale(Session::get('locale'));
return $next($request);
}
}
在 Kernel.php
上注册您的中间件protected $middleware = [
.
.
.
'App\Http\Middleware\Locale'
];