grantholle / api-resource-detection
检测 Eloquent 模型的 API 资源。
1.3.0
2024-03-28 15:27 UTC
Requires
- illuminate/database: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/http: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^9.0
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);
它将自动查找 UserCollection
或 UserCollectionResource
资源类。如果没有找到,它将默认在标准资源类上调用 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'; }); }