大佬们都如何管理你们的多版本接口的

请教:接口有版本号后,控制器层、service层、路由层代码都是按什么策略来迭代的?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

路由最简单,首先是根据版本,例如v1v2这样的。目录结构也可以以Http/api/v1Http/api/v2作为api的目录,路由文件中写好namespace就好。其次就是分组,例如:

// 简单的示例,需要的话自己写namespace等信息
Route::prefix('v1')->group(function () {
    Route::prefix('user')->group(function () {
        // 在这里添加 v1 版本的用户相关路由
    });

    Route::prefix('order')->group(function () {
        // 在这里添加 v1 版本的订单相关路由
    });
});

Route::prefix('v2')->group(function () {
    Route::prefix('user')->group(function () {
        // 在这里添加 v2 版本的用户相关路由
    });

    Route::prefix('order')->group(function () {
        // 在这里添加 v2 版本的订单相关路由
    });
});

至于service控制器层,也有两种分法:

1、控制器负责数据校验,调用不同的service组合成结果。例如先用到userService,获取到用户的id等信息,然后再用id调用orderService查订单信息。

2、控制器负责数据校验,调用复合service,例如还是获取用户订单,直接调用复合的userOrderServiceuserOrderService调用了userRepositoryorderRepository和其他数据仓库,最后组合成一个获取用户订单的服务。

3、如果再细分一下,还可以引入interface数据仓库或者service实现interface,也就是说这个interface规定了当前的类(数据仓库或者service,不同的写法)注入的参数、返回值的类型。

总结:一般来说,分层的话,controllerservicerepositorymodel,就已经够用了,不需要interface。但是很多时候也需要评估项目,不要为了设计而去过度设计,符合实际需求的才是最好的。

2个月前 评论
不负岁月 (楼主) 2个月前
她来听我的演唱会 (作者) 2个月前
不负岁月 (楼主) 2个月前
aliongkk 2个月前
她来听我的演唱会 (作者) 2个月前
WhiteDragon 2个月前
她来听我的演唱会 (作者) 1个月前
WhiteDragon 1个月前
讨论数量: 16

路由最简单,首先是根据版本,例如v1v2这样的。目录结构也可以以Http/api/v1Http/api/v2作为api的目录,路由文件中写好namespace就好。其次就是分组,例如:

// 简单的示例,需要的话自己写namespace等信息
Route::prefix('v1')->group(function () {
    Route::prefix('user')->group(function () {
        // 在这里添加 v1 版本的用户相关路由
    });

    Route::prefix('order')->group(function () {
        // 在这里添加 v1 版本的订单相关路由
    });
});

Route::prefix('v2')->group(function () {
    Route::prefix('user')->group(function () {
        // 在这里添加 v2 版本的用户相关路由
    });

    Route::prefix('order')->group(function () {
        // 在这里添加 v2 版本的订单相关路由
    });
});

至于service控制器层,也有两种分法:

1、控制器负责数据校验,调用不同的service组合成结果。例如先用到userService,获取到用户的id等信息,然后再用id调用orderService查订单信息。

2、控制器负责数据校验,调用复合service,例如还是获取用户订单,直接调用复合的userOrderServiceuserOrderService调用了userRepositoryorderRepository和其他数据仓库,最后组合成一个获取用户订单的服务。

3、如果再细分一下,还可以引入interface数据仓库或者service实现interface,也就是说这个interface规定了当前的类(数据仓库或者service,不同的写法)注入的参数、返回值的类型。

总结:一般来说,分层的话,controllerservicerepositorymodel,就已经够用了,不需要interface。但是很多时候也需要评估项目,不要为了设计而去过度设计,符合实际需求的才是最好的。

2个月前 评论
不负岁月 (楼主) 2个月前
她来听我的演唱会 (作者) 2个月前
不负岁月 (楼主) 2个月前
aliongkk 2个月前
她来听我的演唱会 (作者) 2个月前
WhiteDragon 2个月前
她来听我的演唱会 (作者) 1个月前
WhiteDragon 1个月前

路由最简单,首先是根据版本,例如v1v2这样的。目录结构也可以以Http/api/v1Http/api/v2作为api的目录,路由文件中写好namespace就好。其次就是分组,例如:

// 简单的示例,需要的话自己写namespace等信息
Route::prefix('v1')->group(function () {
    Route::prefix('user')->group(function () {
        // 在这里添加 v1 版本的用户相关路由
    });

    Route::prefix('order')->group(function () {
        // 在这里添加 v1 版本的订单相关路由
    });
});

Route::prefix('v2')->group(function () {
    Route::prefix('user')->group(function () {
        // 在这里添加 v2 版本的用户相关路由
    });

    Route::prefix('order')->group(function () {
        // 在这里添加 v2 版本的订单相关路由
    });
});

至于service控制器层,也有两种分法:

1、控制器负责数据校验,调用不同的service组合成结果。例如先用到userService,获取到用户的id等信息,然后再用id调用orderService查订单信息。

2、控制器负责数据校验,调用复合service,例如还是获取用户订单,直接调用复合的userOrderServiceuserOrderService调用了userRepositoryorderRepository和其他数据仓库,最后组合成一个获取用户订单的服务。

3、如果再细分一下,还可以引入interface数据仓库或者service实现interface,也就是说这个interface规定了当前的类(数据仓库或者service,不同的写法)注入的参数、返回值的类型。

总结:一般来说,分层的话,controllerservicerepositorymodel,就已经够用了,不需要interface。但是很多时候也需要评估项目,不要为了设计而去过度设计,符合实际需求的才是最好的。

2个月前 评论
不负岁月 (楼主) 2个月前
她来听我的演唱会 (作者) 2个月前
不负岁月 (楼主) 2个月前
aliongkk 2个月前
她来听我的演唱会 (作者) 2个月前
WhiteDragon 2个月前
她来听我的演唱会 (作者) 1个月前
WhiteDragon 1个月前

我是把版本放到 header 上面去的默认或者不传就进入默认的版本,然后就转向指定的控制器

file

2个月前 评论
lovewei 2个月前
aliongkk 2个月前
hackchen (作者) 1个月前

版本控制不在路由里做?

1个月前 评论

版本控制不在路由里做? 比如下面这样 $version = request()->header('ver'); Route::namespace('api'')->prefix($version)

1个月前 评论

表面上来看,外部访问服务的url形式发生了变化,但其实质的服务功能并没有发生变更,例如:createOrder, getProduct, userLogin,所以无需管理版本,如果要管理版本直接用git就行了

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!