我为任何一个雄辩的模特提供HasTranslation
- 特质。使用此特征的所有模型都将获得这样的一对多关系(您可以在其中看到我的基本Model to ModelLanguages关系):
public function languages()
{
return $this->hasMany(get_class($this).'Lang', 'master_id', 'id');
}
我想做的是:
始终急切地使用当前用户语言的翻译加载“hasOne”-relationship 。因此,每当用户登录时,我的模型应该像$model->userLanguage
一样急切加载并且类型为ModelLang
。
这看起来像这样,效果很好:
public function userLanguage()
{
$user = \Auth::user();
if (!$user)
{
throw new \Exception(__CLASS__.': userLanguage not available because there is no session');
}
return $this->hasOne(get_class($this).'Lang', 'master_id', 'id')->where('language_id', $user->language_id);
}
我正在努力通过仅仅包含这个特性来自动(急切地)为所有模型加载这种关系。
到目前为止我尝试了什么
在特征中使用构造函数:可以工作,但没有好主意,因为这可能会与其他特征的构造器发生冲突。基本上我确认声明:不要在任何特征中使用构造函数。
使用boot-Trait方法(bootHasTranslation
),但我没有具体的对象来调用load
或with
方法。我没有找到任何钩子进入实例化的雄辩模型,我想将我的关系添加到急切负载
有什么想法吗?有没有明显的东西我在这里忽略了?
答案 0 :(得分:0)
您可以为登录的用户语言创建中间件。
public function handle($request, Closure $next)
{
if (!Auth::check()) {
return redirect('/')->with('Success','You have successfully logged out');
}
$user = \Auth::user();
$language = $user->languages()->where('language_id', $user->language_id);
$request->attributes->add([
'user_language' => $language
]);
$next($request);
}
您可以在像
这样的中间件之后获取此数据$request->attributes->get('user_language');