Задать вопрос
@Artem0071
Безработный mr. Junior

Почему hidden элементы видны в JsonResource?

Laravel 5.6

Есть модель User
В нем есть
protected $hidden = [
        'email'
    ];


Так вот, создал UserResource (для API):
public function toArray($request)
{
  return [
     'email' => $this->email, // email отображается
     'email' => $this->resource->email, // email отображается
  ]
}


Пришлось делать следующее:
public function toArray($request)
{
  $hidden = $this->resource->getHidden();
  return [
     'email' => in_array('email', $hidden) ? null : $this->resource->email, // email не отображается
  ]
}


То есть, laravel знает что это скрытое поле, но все равно его показывает
Может я как то не так получаю параметр?
  • Вопрос задан
  • 138 просмотров
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Потому что вы обращаетесь к нему через магический геттер на обьекте ресурса ($this->email), который в свою очередь просто дергает тоже поле на ресурсе (модельке). $hidden у модели скрывает поле только при ->toArray(), но оно все еще есть в аттрибутах.

Все логично и так и должно работать) Выходы:
1) убирать 'email' => $this->email из ресурса
2) делать
class UserResource {
    private $includeEmail = false;

    public function toArray($request) {
        return [
            'email' => $this->when($this->includeEmail, $this->email)
        ];
    }

    public function includeEmail() {
        $this->includeEmail = true;

        return $this;
    }
}


И позже делаете return (new UserResource($model))->includeEmail(); в контроллере.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы