Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用laravel版本api输出的另一种方法?_Laravel_Api_Versioning - Fatal编程技术网

使用laravel版本api输出的另一种方法?

使用laravel版本api输出的另一种方法?,laravel,api,versioning,Laravel,Api,Versioning,我就要 使用Http/Json/V1/MyModel.php扩展我的App/Orm/MyModel.php,这样我就可以将$appends、$hiels整齐地放在V1中 名称空间和前缀V1的某些路由 可能会为路由模型绑定执行一些自定义解析器 我在想。。。真正地他们没有把这个建在。。。我错过了什么?必须要有一个快速的交钥匙。我很想知道其他人是如何做到这一点的,所以请插话。尝试参考资料而不是模型 请查看资源: 并将逻辑添加到资源中,以便根据API版本显示模型的不同版本。您仍然可以使用$append

我就要

使用Http/Json/V1/MyModel.php扩展我的App/Orm/MyModel.php,这样我就可以将$appends、$hiels整齐地放在V1中 名称空间和前缀V1的某些路由 可能会为路由模型绑定执行一些自定义解析器 我在想。。。真正地他们没有把这个建在。。。我错过了什么?必须要有一个快速的交钥匙。我很想知道其他人是如何做到这一点的,所以请插话。

尝试参考资料而不是模型 请查看资源:

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

使用这种方法,我们返回模型的资源,而不是模型本身

以下是不同API版本的用户资源示例:

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输出名称空间的模型将从从属服务器读取。明白了。通过编辑数据库配置文件,可以指定不同的读/写连接,如下所述: