为什么Laravel的App :: getLocale()方法不一致?

时间:2016-07-06 16:46:36

标签: php laravel

我在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请求中返回不同的值。

这不是第一次发生这种情况,顺便说一下。有时看来,视图“了解”实际的应用程序区域设置,而不是控制器,模型或库。混乱。

想法?

1 个答案:

答案 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'
];