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