abdulrhmansouda/laravel-customizable-api-resource

此包帮助 Laravel 开发者自定义 API 资源。

1.1.1 2024-07-08 20:49 UTC

This package is auto-updated.

Last update: 2024-09-08 21:17:00 UTC


README

此包提供了一种灵活的方式来自定义 API 资源响应,根据用户的请求,可以包含或排除特定的资源字段。

安装

要安装此包,请使用 Composer

composer require abdulrhmansouda/laravel-customizable-api-resource

用法

创建一个新的资源类,实现 Customizable 接口并使用 CustomizableApiResource 特性

<?php

namespace App\Http\Mobile\V1\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Resources\MissingValue;
use LaravelCustomizableApiResource\Customizable;
use LaravelCustomizableApiResource\CustomizableApiResource;

class TestResource extends JsonResource implements Customizable
{
    use CustomizableApiResource;


    // replace toArray method with basicResource method
    public function basicResource(Request $request): array
    {
        return [
            'id'        => $this->id,
            'name'      => $this->name,
        ];
    }

    // a custom subResource
    public function secretSubResource(): array
    {
        return [
            'ownerName'     => $this->owner_name,
            'user'          => UserResource::make($this->whenLoaded('user')),
        ];
    }

    // another custom subResource
    public function someDetails($parameters): array
    {
        return [
            'moreDetail'                    => $this->more_detail,
            'somePassedDetailAsParameters'  => $parameters['somePassedDetailAsParameters'],
        ];
    }
}

在您的路由中,可以使用 customMakecustomCollection 方法创建具有所需配置的资源实例

Route::get('test', function () {
    $ad = Ad::with('user')->first();

    return TestResource::customMake($ad, [
        'secretSubResource',
        'someDetails' => [
            'somePassedDetailAsParameters' => 'detail one',
        ],
    ]);
});

这是输出

{
    "data": {
            "id": 1,
            "name": "name",
            "ownerName": "ownerName",
            "user": {
                "id": 2,
                "name": "ahmend"
            }
        }
}

处理集合

Route::get('test', function () {
    $ad = Ad::limit(10)->get();

    return TestResource::customCollection($collection, [
        'secretSubResource',
    ]);
});

这是输出

{
    "data": [
        {
            "id": 1,
            "name": "name",
            "ownerName": "ownerName"
        },
        {
            "id": 1,
            "name": "name",
            "ownerName": "ownerName"
        }
    ]
}

您可以创建尽可能多的函数。此外,您还可以更改 secretSubResourcesomeDetails 的名称。