路由版本控制的实现。
Laravel 版本:5.6.4
PHP 版本:7.3
背景介绍
因为现在的项目确实遇到了 v1 慢慢迭代,到 v5 的情况了, 最开始是所有模块接口路由都放在了 api.php 一个文件,三千多行的路由配置, 每次新增,查找,修改 都非常的不方便,后来是通过 RouteServiceProvider.php 根据不同功能大模块,自定义了 几个新的路由文件, 可是随着版本的升级,又出现了 我发帖的这个问题,因为功能从 v1 ~ v5 其实就一个版本号改变了,其他的路径,方法名都没变,然而每次迭代一个新版本,又得复制一遍代码,只是改了一个版本号,这让我感觉非常的臃肿,和傻瓜。而且日积月累起来,依旧会导致一个功能类的路由文件非常大。
问题描述
最近在写Api接口, 为了不因为功能改动而影响之前的业务,这边想做一个版本控制,最开始在 api.php 路由文件路由分组的方式写死 版本号,可是随着项目迭代,会出现 v2,v3,v4 这样的话 就得定义很多的重复分组(只是版本号不同)。感觉这种方式一点都不优雅和简洁。
url: xxx.com/api/v1/users/list
Route::group(['prefix' => 'v1/users'])function () {
//获取用户列表
Route::get('/', 'v1\UserController@getUserList');
});
Route::group(['prefix' => 'v2/users'])function () {
//获取用户列表
Route::get('/', 'v2\UserController@getUserList');
});
于是我这边就通过参数接收的方式,通过url 传递过来的版本号,动态的处理版本控制,虽然看上去是解决了,无需重复写多个路由版本分组的方式,但是我还是觉得这种方式写出来的代码非常的臃肿。
url: xxx.com/api/v1/users/list
//用户列表
Route::group(['prefix' => '{version}/users'], function (){
Route::get('/list', function ($version) {
$class = 'App\Http\Controllers\\' . $version . '\\UsersController';
if (class_exists($class)) {
return app()->call([app()->make($class), 'getUserList']);
}
return abort(404);
});
});
动态匹配版本前缀及命名空间。web.php里面只需要基于RouteServiceProvider。