Измените ресурс, используемый для отображения каждого элемента в коллекции ресурсов
У меня есть модель 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

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';
}
