0

我有多个资源,大部分资源内容与所有其他资源相同,并且很难修改所有资源,以防我需要更新/添加资源中的键/值。

有什么方法可以创建一个包含所有常见字段的主要资源,然后在我的另一个资源中调用主要资源并添加一些额外的字段。

这是我正在调用CitizenFeedResource文件的控制器。

if ($events->total()) {
            return CitizenFeedResource::collection($events);
        }

这是我的CitizenFeedResource文件。

use Illuminate\Http\Resources\Json\JsonResource;

class CitizenFeedResource extends JsonResource
{

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'description' => $this->description,
            'start_timestamp' => optional($this->start_timestamp)->toDateTimeString(),
            'end_timestamp' => optional($this->end_timestamp)->toDateTimeString(),
            'location' => [
                'name' => $this->location,
                'landmark' => $this->landmark,
                'coordinates' => $this->coordinates,
                'city' => $this->city,
            ],
            'open_event' => $this->open_event,
            'full_day_event' => $this->full_day_event,
            'banner' => $this->banner,
            'url' => $this->path(),
            'web_url' => $this->webUrl(),
            'categories' => $this->categories,
            'timestamp' => $this->created_at->toDateTimeString(),
            'timestamp_ago' => $this->created_at->diffForHumans(),
            'statistics' => $this->statistics,
            'additional_details' => $this->additionalDetails(),
            'municipal_details' => $this->municipal_details,
            'user' => optional($this->user)->getProfile($this->channel, '1.1'),
            'complaint_id' => $this->complaint_id,
            'volunteers' => (isset($this->volunteers) && $this->volunteers) ? $this->user->getVolunteerProfile($this->volunteers, '1.1') : array(),
            'share_count' => (isset($this->statistics) && isset($this->statistics['share_count'])) ? array_sum($this->statistics['share_count']) : 0,
            'volunteer_status' => $this->getVolunteerStatus($request),
            'editable' => $this->editable(),
            'type' => 'Event',
        ];
    }
}
4

1 回答 1

0

您不必直接从 JsonResponse 扩展,因此您可以创建一个主对象,让我们这样说:

use Illuminate\Http\Resources\Json\JsonResource;

class BaseResource extends JsonResource
{

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'description' => $this->description,
        ];
    }
}

接着

class CitizenFeedResource extends BaseResource
{

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
       $data = parent::toArray($request);
       $data['custom_field'] = $this->custom_field;
       // ...
       return $data;
    }
}
于 2018-06-18T13:11:30.717 回答