gpt4 book ai didi

laravel - 使用 laravel 对 api 输出进行版本控制的另一种方法?

转载 作者:行者123 更新时间:2023-12-05 03:03:54 28 4
gpt4 key购买 nike

我要...

  1. 使用 Http/Json/V1/MyModel.php 扩展我的 App/Orm/MyModel.php,这样我就可以将 $appends、$hides、toArray() 整齐地隐藏在 V1 中
  2. V1 的命名空间和一些路由前缀
  3. 可能会为路由模型绑定(bind)做一些自定义解析器

我在想……真的吗?他们没有内置这个......我在这里错过了什么?为此必须有一个快速的交 key 方案。我很想知道其他人是如何做到这一点的,所以请插话。

最佳答案

尝试资源而不是模型

查看资源: https://laravel.com/docs/5.7/eloquent-resources

并将您的逻辑添加到资源中,以便根据 API 版本显示模型的不同版本。您仍然可以使用 $appends$hidden

通过这种方法,我们返回模型的资源而不是模型本身。

以下是不同 API 版本的 UserResource 示例:

class UserResource extends JsonResource
{
private $apiVersion;

public function __construct($resource, int $apiVersion = 2) {
$this->apiVersion = $apiVersion; // OPTION 1: Pass API version in the constructor
parent::__construct($resource);
}

public function toArray($request): array
{
// OPTION 2: Get API version in the request (ideally header)
// $apiVersion = $request->header('x-api-version', 2);

/** @var User $user */
$user = $this->resource;

return [
'type' => 'user',
'id' => $user->id,
$this->mergeWhen($this->apiVersion < 2, [
'name' => "{$user->first_name} {$user->last_name}",
], [
'name' => [
'first' => $user->first_name,
'last' => $user->last_name
],
]),
'score' => $user->score,
];
}
}

你可以调用:

$user = User::find(5);
return new UserResource($user);

如果您需要不同的连接方式,您可以:

$user = User::on('second_db_connection')->find(5);

所以 V1 API 得到:

{
id: 5,
name: "John Smith",
score: 5
}

并且 V2 API 获取:

{
id: 5,
name: {
first: "John",
last: "Smith",
},
score: 5
}

现在,如果稍后您想将分数重命名为数据库中的点,并且在 API 的 V3 中您还想更改 JSON 输出,但要保持向后兼容性,您可以这样做:

   $this->mergeWhen($this->apiVersion < 3, [
'score' => $user->points,
], [
'points' => $user->points,
])

前缀路由

您可以轻松地为路由添加前缀,如下所述:https://laravel.com/docs/5.7/routing#route-group-prefixes

Route::prefix('v1')->group(function () {
Route::get('users', function () {
// ...
});
});

显式路由模型绑定(bind)

要进行自定义路由模型绑定(bind),请查看:https://laravel.com/docs/5.7/routing#route-model-binding

例如

Route::bind('user', function ($value) {
return App\User::where('name', $value)->first() ?? abort(404); // your customer logic
});

关于laravel - 使用 laravel 对 api 输出进行版本控制的另一种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415035/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com