Коллекция Laravel#makeVisible() как метод модели

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

У меня есть какая-то красноречивая модель со скрытым payload полем

В некоторых местах я хочу включить это поле в представление JSON. Я делаю это с помощью метода makeVisible:

 $models->makeVisible('payload');
  

Но я не думаю, что это хороший код ООП (SRP, DIP, правила DRY, что угодно). Я хотел бы скрыть это за некоторой абстракцией, используя некоторый повторно используемый метод, например, withPayload(), внутри моего класса модели. Есть ли какой-либо способ добиться этого в Laravel? Может быть, как-то с помощью областей запросов и метода pluck?

Ответ №1:

Я думаю, что способ, которым вы сейчас пользуетесь makeVisible , в порядке. Вы ничего не добьетесь, прячась ->makeVisible('payload'); за другим методом. Это был бы нестандартный способ выполнения задач, и следующему разработчику пришлось бы пойти и изучить и запомнить, что делает новый метод.

$hidden и makeVisible дает понять следующему разработчику, что данные, возможно, являются конфиденциальными данными и не должны быть видны всем пользователям. Если вы считаете, что могли бы сделать данные видимыми чаще, чем скрывать их, подумайте о том, чтобы либо добавить поле в $visible массив, либо удалить оба массива $visible and $hidden (если вы не используете его для каких-либо других полей), и используйте makeHidden метод, чтобы скрыть данные, когда вам нужно.

Ответ №2:

Я предлагаю вам погрузиться во фракталы (spatie / laravel-fractal — хорошая оболочка для этого) и поместить туда логику для представления вашей модели в виде JSON.

Там вы можете определить базовую структуру вашего вывода JSON (т.Е. Поля, Которые у вас всегда есть) и использовать include везде, где вам нужны ваши конкретные поля.

Ответ №3:

Я думаю, что метод, который вы ищете, это :

 Model::setVisible('field')
  

From => это