Скрытие полей в ресурсах API с помощью Gates в Laravel

В моем приложении есть ресурс Product API, вот так

    /**
     * Transform the resource collection into an array.
     *
     * @param  Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'desc' => $this->desc,
            'color' => $this->color,
            'amount' => $this->amount,
            'available' => $this->available,
            'createdAt' => $this->created_at,
            'updatedAt' => $this->updated_at,
        ];
    }

В моем приложении есть несколько ролей, например, администратор, зритель. Когда администратор обращается к api, api возвращает все поля, но когда зритель обращается к api, он возвращает только ограниченные поля.

Как я могу справиться с этим, используя Gates & Policies?

Могу я сделать что-то подобное

'createdAt' => $this->when($this->authorize('product.list'), $this->created_at)

1 ответ

Вы можете использовать красноречивый аксессуар в своемProduct модель:

    public function getCreatedAtAttribute($createdAt)
    {
        if (Gate::allows('see-product-details', $this)) {
            return $createdAt;
        } else {
            return null;
        }
    }

Конечно, вы также должны написать see-product-details Ворота.

В противном случае это может сработать (не проверено):

    public function getCreatedAtAttribute($createdAt)
    {
        if ($this->authorize('view', [Product::class, $this])) {
            return $createdAt;
        } else {
            return null;
        }
    }
Другие вопросы по тегам