使用laravel版本api输出的另一种方法?
我就要 使用Http/Json/V1/MyModel.php扩展我的App/Orm/MyModel.php,这样我就可以将$appends、$hiels整齐地放在V1中 名称空间和前缀V1的某些路由 可能会为路由模型绑定执行一些自定义解析器 我在想。。。真正地他们没有把这个建在。。。我错过了什么?必须要有一个快速的交钥匙。我很想知道其他人是如何做到这一点的,所以请插话。尝试参考资料而不是模型 请查看资源: 并将逻辑添加到资源中,以便根据API版本显示模型的不同版本。您仍然可以使用$appends和$hidden 使用这种方法,我们返回模型的资源,而不是模型本身 以下是不同API版本的用户资源示例:使用laravel版本api输出的另一种方法?,laravel,api,versioning,Laravel,Api,Versioning,我就要 使用Http/Json/V1/MyModel.php扩展我的App/Orm/MyModel.php,这样我就可以将$appends、$hiels整齐地放在V1中 名称空间和前缀V1的某些路由 可能会为路由模型绑定执行一些自定义解析器 我在想。。。真正地他们没有把这个建在。。。我错过了什么?必须要有一个快速的交钥匙。我很想知道其他人是如何做到这一点的,所以请插话。尝试参考资料而不是模型 请查看资源: 并将逻辑添加到资源中,以便根据API版本显示模型的不同版本。您仍然可以使用$append
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::on('second_db_connection')->find(5);
$this->mergeWhen($this->apiVersion < 3, [
'score' => $user->points,
], [
'points' => $user->points,
])
因此v1api得到:
{
id: 5,
name: "John Smith",
score: 5
}
{
id: 5,
name: {
first: "John",
last: "Smith",
},
score: 5
}
V2 API将获得:
{
id: 5,
name: "John Smith",
score: 5
}
{
id: 5,
name: {
first: "John",
last: "Smith",
},
score: 5
}
现在,如果以后您想将分数重命名为DB中的分数,并且在API的V3中,您还想更改JSON输出,但要保持向后兼容性,您可以执行以下操作:
$user = User::on('second_db_connection')->find(5);
$this->mergeWhen($this->apiVersion < 3, [
'score' => $user->points,
], [
'points' => $user->points,
])
显式路由模型绑定
要进行自定义管线模型绑定,请查看:
e、 g
你已经需要v2了吗?很可能你不会通过v1,所以只要坚持使用无版本的API,到时候你就可以重构了。@Kyslik只是提前计划。浪费你的时间,想象一下你有v1,而且它做得很好;现在你决定开发v2;过程是什么?您需要复制所有文件并更改名称空间以及中间件/服务提供商/路由上面的其他内容,现在您可以开始使用v2了。你不能在需要的时候再做吗?v1将没有特殊的名称空间,v2将有它。@Kyslik这只是为了输出版本控制。@Kyslik如果你真的在明年登记的话,那将是非常有趣的-哈哈。如果我发现自己仍然坐在同一个位置上不停地敲击键盘,那将是非常悲伤的。雄辩的资源是正确的,谢谢。看起来很有限,但有时候限制是件好事。干杯@TarekAdam请将此答案标记为正确,如果它解决了您的问题,请继续研究此问题。再看一眼,但我只是没有看到好处~除了。。。很轻。在缺点方面,我不能设置连接,这是一个交易的破坏者,因为Json输出名称空间的模型将从从属服务器读取。明白了。通过编辑数据库配置文件,可以指定不同的读/写连接,如下所述: