Я предоставляю HasTranslation
-Просто для любой из моих красноречивых моделей. Все модели, использующие эту черту, получат отношение «один ко многим», как это (где вы можете увидеть мои базовые отношения Model к ModelLanguages):
public function languages()
{
return $this->hasMany(get_class($this).'Lang', 'master_id', 'id');
}
Что я хочу сделать, это:
Всегда стремимся загрузить отношения hasOne с переводом языка текущего пользователя. Поэтому, когда пользователь входит в систему, мои модели должны иметь что-то вроде $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
метод на. Я не нашел никакой зацепки в инстанцированной красноречивой модели, где я хочу добавить свое отношение к активной нагрузке
Есть идеи? Есть что-то очевидное, что я здесь упустил?
Вы можете создать промежуточное программное обеспечение для авторизованного языка пользователя.
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');
Других решений пока нет …