我正在尝试在我的构造中选择要在该类中的任何函数中使用的语言:
我的路线:
Route::group(['prefix' => 'admin', 'middleware' => ['AdminMiddleWare','auth','localization']], function(){
Route::get('/', 'AdminController@index')->name('admin.index');
});
我的中间件:
public function handle($request, Closure $next)
{
if (Session::has('locale') AND array_key_exists(Session::get('locale'), Config::get('languages'))) {
App::setLocale(Session::get('locale'));
}
else {
App::setLocale(Config::get('app.locale'));
}
return $next($request);
}
我的控制器:
public $lang;
public function __construct()
{
$this->lang = Language::where('lang','=',app()->getLocale())->first();
}
public function index()
{
$lang = $this->lang;
return $lang;
}
但我只获得默认的语言环境;
但如果我将控制器更改为:
public function index()
{
$lang = Language::where('lang','=',app()->getLocale())->first();
return $lang;
}
它会工作......
如何进入构造并在所有函数中使用它?
在Laravel中,控制器在中间件运行之前被实例化。在中间件有机会检查并存储区域设置值之前,控制器的构造函数正在进行查询。
有多种方法可以解决这个问题 - 重要的是在中间件运行后进行调用。一种方法是在控制器上使用getter方法:
class Controller
{
/**
* @var Language
*/
private $lang;
public function index()
{
$lang = $this->getLang();
// ...
}
private function getLang()
{
if ($this->lang) {
return $this->lang;
}
return $this->lang = Language::where('lang','=',app()->getLocale())->first();
}
}