Laravel 更改用于呈现ResourceCollection中每个项的资源

Laravel 更改用于呈现ResourceCollection中每个项的资源,laravel,Laravel,我有一个模型App\Invoice.php和一个API资源App\Http\Resources\Invoice.php,在将其作为JSON数据发送时对其进行转换 Resources\Invoice.php实现toArray(): 我还有一个资源集合App\Http\Resources\InvoiceCollection.php,用于将发票列表作为JSON对象数组发回 在不更改资源集合的默认实现的情况下,它使用Resources\Invoice类转换添加到数组中的每个Invoice对象 Resou

我有一个模型
App\Invoice.php
和一个API资源
App\Http\Resources\Invoice.php
,在将其作为JSON数据发送时对其进行转换

Resources\Invoice.php
实现
toArray()

我还有一个资源集合
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
类以使用此新摘要资源而不是原始
Invoice
资源

我想到的一种方法是将摘要资源命名为
Invoice.php
(并将返回完整
Invoice
详细信息的资源重命名为类似于
InvoiceComplete
)的名称,这样它会被集合自动拾取和使用,但是我想学习如何更改集合并指定使用的资源。

根据,您可以删除资源集合中名为
$collects
的属性,该属性可以分配一个类名

自定义基础资源类 通常,资源集合的$this->collection属性会自动填充集合的每个项到其单个资源类的映射结果。假定singular resource类是集合的类名,不带尾随集合字符串

例如,UserCollection将尝试将给定的用户实例映射到用户资源中。要自定义此行为,您可以覆盖资源集合的$collects属性:


我认为您可以重写集合构造函数,并在其中传递您的
发票摘要的类名。谢谢!我不知道我是如何在文档中漏掉这些内容的,但它现在正在工作。
    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()
        ];
    }
<?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';
}