Laravel - Обновление столбца красноречивой модели на основе условия для всех вызовов - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть следующая laravel красноречивая модель:

Имя: Зона

Поля: id, name, name_en

name - имя по умолчанию language name_en - имя на английском языке Engli sh

Я хочу, чтобы всякий раз, когда я запрашиваю эту красноречивую модель (e.g Zone::find(1)), он проверяет, какой язык используется пользователем, и устанавливает name на правильный язык. В этом случае, если мой пользовательский язык en, он установит имя to name_en`.

Цель состоит в том, чтобы вернуть свойство name на нужном языке (если пользователь lang равен en это займет name_en, или по умолчанию name в противном случае)

Что мне нужно, так это запускать этот код всякий раз, когда я использую модель Zone:

if ($ user-> lang_code == "en) {$ this-> name = $ this-> name_en;}

Конечно, я могу изменить ВСЕ свои API и сделать это, но я ищу решение, которое применимо к любому месту, в котором я использую модель зоны в своем приложении, без изменения каждого места вручную.

Есть ли место Laravel, где я могу выполнить такой код после каждого запроса к моему Zone модель?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Для этого можно использовать Eloquent Accessor .

Определить функцию getNameAttribute в вашей Zone модели следующим образом.

public function getNameAttribute($value)
{
    // get the user's locale
    $locale = Auth::user()->locale;

    // If the user's locale is same as app locale,
    // no changes. Just return the name as it is.
    if ($locale === app()->getLocale()) {
        return $value;
    }
    // If the user has a different locale,
    // check if there is a name matching that locale and return it.
    // If no matching name found, return original name.
    return $this->{'name_'.$locale} ?? $value;
}

Сейчас всякий раз, когда вы обращаетесь к свойству name модели zone, эта функция будет возвращать соответствующий name на основе Пользовательская локаль

Работает с PHP7 .0 или выше.

Этот подход поддерживает больше локалей, которые можно добавить на более позднем этапе. Иными словами, вам не нужно изменять эту функцию для поддержки новых локалей.

0 голосов
/ 15 апреля 2020

Я рекомендую использовать переводимый пакет spatie / laravel. Вы можете использовать его следующим образом:

$newsItem = new NewsItem; // This is an Eloquent model
$newsItem
->setTranslation('name', 'en', 'Name in English')
->setTranslation('name', 'nl', 'Naam in het Nederlands')
->save();

$newsItem->name; // Returns 'Name in English' given that the current app locale is 'en'
$newsItem->getTranslation('name', 'nl'); // returns 'Naam in het Nederlands'

app()->setLocale('nl');

$newsItem->name; // Returns 'Naam in het Nederlands'  

Переводы хранятся как json. Для их хранения не требуется дополнительная таблица, вы даже можете установить запасной языковой стандарт

https://github.com/spatie/laravel-translatable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...