我有很多控制器,我想在所有这些(实际上是所有项目)中设置此代码,我该怎么做?
if( !empty(Input::get('lan')) ){
Auth::user()->language = Input::get('lan');
App::setLocale( Auth::user()->language );
}else{
App::setLocale( Auth::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',
],
];