Laravel设置用户语言


Laravel Set up User Language

我有很多控制器,我想设置这个代码在所有这(实际上所有的项目),我怎么能做到这一点?

if( !empty(Input::get('lan')) ){
  Auth::user()->language = Input::get('lan');
  App::setLocale( Auth::user()->language );
}else{
  App::setLocale( Auth::user()->language );
}

你可以使用Laravel的中间件中间件是封装请求处理的一层代码,可以在处理请求之前或之后执行额外的代码。

首先,需要中间件类。它需要有一个名为handle()的方法来执行所需的逻辑。在您的例子中,它可能看起来像这样:

<?php namespace App'Http'Middleware;
use Auth;
use App;
class SetLang {
  public function handle($request, Closure $next) {
    if(empty($request->has('lan'))) {
      if (Auth::user()) {
        Auth::user()->language = $request->input('lan');
        Auth::user()->save(); // this will do database UPDATE only when language was changed
      }
      App::setLocale($request->input('lan'));
    } else if (Auth::user()) {
      App::setLocale(Auth::user()->language);
    }
    return $next($request);
  }
}

然后在App'Http'Kernel类中注册中间件,以便它对每个请求执行:

protected $middleware = [
    //here go the other middleware classes
    'App'Http'Middleware'SetLang',
];

您可以在这里的文档中找到关于中间件的更多信息:http://laravel.com/docs/master/middleware

看来,在最新版本的Laravel(我在5.8)这个中间件的工作,你需要把它放在$middlewareGroups下,否则对Auth::user()的调用总是空的。

jedrzej-kurylo答案之后,只需将中间件移动到:

protected $middlewareGroups = [
        'web' => [
                ...
                'App'Http'Middleware'SetLang',
        ],
];