失败/laravel-resourceable

从模型本身访问模型的底层资源

1.0.1 2023-02-13 14:43 UTC

This package is auto-updated.

Last update: 2024-09-13 18:32:27 UTC


README

Laravel Resourceable 允许您在 Eloquent 模型和其关联的资源之间设置清晰的关系:**模型拥有其资源**。

截至 Laravel 9.5,这仍然不是很明显。确实有一个默认路径来存储主模型的资源,但您仍然需要像 new UserResource($user) 这样的操作。也就是说,您只是创建了一个特定资源的实例,并将模型作为参数传递。您甚至可以传递其他类型的模型,或者甚至传递不是 Eloquent 模型的东西(在合理范围内),一切都会正常工作。

使用这个包,我们使关系明确,并更改代码以反映一个模型的 JsonResource 属于该模型,而不是反过来。

用法

使用 HasResources 特性和在您的模型中实现 Resourceable 接口。

# App\Models\User

use Faliure\Resourceable\Contracts\Resourceable;
use Faliure\Resourceable\Traits\HasResources;

class User implements Resourceable
{
    use HasResources;
}

获取单个模型的关联资源

$user = User::first();

// Without Resourceables
$resource = new UserResource($user);

// With Resourceables
$resource = $user->resource();

获取模型的所有资源

// Without Resourceables
$users = User::all();
$resources = UserResource::collection($user);

// With Resourceables
$resources = User::resources();

获取给定模型资源的自定义集合

// Without Resourceables
$users = User::where('some', 'constraint')->get();
$resources = UserResource::collection($users);

// With Resourceables
$resources = User::resourcesQuery()->where('some', 'constraint')->get();

如您所见,这种语法糖使模型成为焦点,资源作为其许多关联实体之一。

定制

默认情况下,Resourceable 假设您的主要模型 JsonResource 遵循标准

  • 用户的主要资源是 App\Http\Resources\UserModel

如果情况不是这样,您可以在 Resourceable 模型中定义一个属性 resourceClass,如下所示

class User implements Resourceable
{
    // ...

    protected string $resourceClass = TheResourceClass::class;
}

此外,您可以通过将可选的 $resourceClass 参数传递给接口中定义的任何方法,为模型获取不同类型的资源。具体来说

$resource = $user->resource(SomeOtherResourceType::class);

$resources = User::resources(SomeOtherResourceType::class);

$filteredResources = User::resourcesQuery(SomeOtherResourceType::class)
    ->where('some', 'constraint')
    // ->...
    ->get();

就是这样简单!

resourcesBuilder 如何工作?

resourcesBuilder 是一个自定义的 Eloquent Builder,它允许您像通常一样编写 Eloquent 链,但它修改了最终结果,以返回关联的资源而不是模型或其集合。

有关更多信息和其他用法,请查看 faliure/laravel-custom-builder