从laravel中的构造中获取语言

问题描述 投票:0回答:1

我正在尝试在我的构造中选择要在该类中的任何函数中使用的语言:

我的路线:

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 middleware multilingual construct
1个回答
1
投票

在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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.