grantholle/api-resource-detection

检测 Eloquent 模型的 API 资源。

1.3.0 2024-03-28 15:27 UTC

This package is auto-updated.

Last update: 2024-08-28 16:22:01 UTC


README

此包提供了一种特性,可以将它添加到您的 Eloquent 模型中以实现自动 API 资源检测。

安装

composer require grantholle/api-resource-detection 

使用

您可以通过使用 php artisan make:resource 命令为您模型生成资源。这将在您的 app/Http/Resources 目录中创建一个资源。此包检测不同的命名约定。您可以按模型名称命名资源,或者使用 Resource 后缀命名,例如 ModelResource。在具有资源的模型中,您可以添加 HasResource 特性。

假设我们有一个名为 UserResource 的资源。

php artisan make:resource UserResource

让我们将特性添加到 User 模型中

namespace App\Models;

use GrantHolle\Http\Resources\Traits\HasResource;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasResource;

    protected $guarded = [];
}

现在,当您想要获取模型的资源时,可以在模型实例上调用 toResource() 以检测并检索模型的 API 资源。

$user = User::find(1);

// This will be a UserResource instance
$user->toResource();

您还可以使用 Model::resource() 的替代语法。

$user = User::find(1);

User::resource($user);

这同样适用于模型集合。

$users = User::all();

User::resource($users);

它将自动查找 UserCollectionUserCollectionResource 资源类。如果没有找到,它将默认在标准资源类上调用 collection() 函数。

如果您的应用程序使用除默认资源命名空间之外的其他命名空间,您可以告诉它为您资源使用不同的命名空间。

在服务提供者中,

public function boot() {
    \GrantHolle\Http\Resources\JsonResource::resolveResourceNamespaceUsing(function () {
        return 'My\\Resource\\Namespace\\';
    });
}

您还可以更改资源的猜测方式,并根据模型返回新的类名。默认情况下,它将在默认资源命名空间中查找您的模型名称或带有 Resource 后缀的模型名称。您还可以自定义集合的解析方式。

public function boot() {
    \GrantHolle\Http\Resources\JsonResource::guessResourceNamesUsing(function ($modelClass) {
        $modelName = class_basename($modelClass);
        
        // This will return a resource with the class name
        // ModelApiResource in the `My\Resource\Namespace` namespace.
        return 'My\\Resource\\Namespace\\' . $modelName . 'ApiResource';
    });
    
    \GrantHolle\Http\Resources\JsonResource::guessResourceCollectionNamesUsing(function ($modelClass) {
        $modelName = class_basename($modelClass);
        
        // This will return a resource with the class name
        // ModelCollectionApiResource in the `My\Resource\Namespace` namespace.
        return 'My\\Resource\\Namespace\\' . $modelName . 'CollectionApiResource';
    });
}