Измените ресурс, используемый для отображения каждого элемента в коллекции ресурсов

Измените ресурс, используемый для отображения каждого элемента в коллекции ресурсов

24.12.2019 12:11:20 Просмотров 37 Источник

У меня есть модель App\Invoice.phpи API-ресурс App\Http\Resources\Invoice.phpдля преобразования его при отправке в виде данных JSON.

Resources\Invoice.php-реализация toArray():

    public function toArray($request)
    {
        return [
            'invoice_number' => $this->invoice_number,
            'invoice_date' => $this->invoice_date,
            ...  
            // many more fields
        ];
    }

У меня также есть App\Http\Resources\InvoiceCollection.phpдля отправки назад списка счетов-фактур в виде массива объектов JSON.

Не изменяя реализацию коллекции ресурсов по умолчанию, он использует класс Resources\Invoiceдля преобразования каждого объекта Invoice, добавленного в массив.

Resources\InvoiceCollection:

    public function toArray($request)
    {
        return parent::toArray($request);
    }

Теперь мне нужно отправить назад коллекцию счетов-фактур, но с меньшим количеством полей, чем у стандартного Resources\Invoice.phpкласс реализует. Я мог бы использовать тот же ресурс, но мне не нравится передавать больше данных, чем мне нужно.

Поэтому я создал новый ресурс под названием InvoiceSummary.phpи его toArray()имеет всего несколько полей:

    public function toArray($request)
    {
        return [
            'invoice_number' => $this->invoice_number,
            'invoice_date' => $this->invoice_date,
            'issuer_name' => $this->issuer->name,
            'recipient_name' => $this->recipient->name,
            'invoice_total' => $this->totalAmount()
        ];
    }

Как изменить класс Resource\InvoiceCollection\InvoiceCollection, чтобы использовать этот новый сводный ресурс вместо исходного Invoice(и переименовать ресурс, который возвращает полную Invoice.php), поэтому он автоматически подбирается и используется коллекцией, но я хотел бы узнать, как изменить коллекцию и указать, какой ресурс используется.

У вопроса есть решение - Посмотреть?

Ответы - Измените ресурс, используемый для отображения каждого элемента в коллекции ресурсов / Change the resource used to render each item in a ResourceCollection

Является ответом!
PtrTon

24.12.2019 12:21:09

В соответствии с этой документацией вы можете удалить свойство в вашей коллекции ресурсов под названием $collects, которому можно присвоить имя класса.

Настройка Базового Класса Ресурсов Как правило, свойство $this - >collection коллекции ресурсов автоматически заполняется результатом сопоставления каждого элемента коллекции с его единственным классом ресурсов. Предполагается, что сингулярный класс ресурсов является именем класса коллекции без конечной строки коллекции.

Например, UserCollection попытается сопоставить данные пользовательские экземпляры с пользовательским ресурсом. Чтобы настроить это поведение, можно переопределить свойство $collects коллекции ресурсов:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class UserCollection extends ResourceCollection
{
    /**
     * The resource that this resource collects.
     *
     * @var string
     */
    public $collects = 'App\Http\Resources\Member';
}
https://stackoverflow.com/questions/59461335/change-the-resource-used-to-render-each-item-in-a-resourcecollection/59461426#comment105104425_59461426
Спасибо! Я не знаю, как мне удалось пропустить это в документации, но сейчас это работает.
Закрыть X