imageplus / apivcs
API版本控制系统
This package is auto-updated.
Last update: 2024-09-16 02:13:34 UTC
README
这是一个简单易用的版本控制系统,允许根据API请求动态调整资源,弃用或注入。它为API提供了一套完全可配置的访问控制列表(ACL),以帮助应用开发者和根据设备允许的功能进行公开访问。
因此,这是一个很好的工具,可以在不牺牲设备兼容性的情况下,保持API的生命周期更新。它也是一种强制移动设备应用程序更新的好方法,因为它可以拒绝对特定版本或最低版本的请求。
该工具在这方面不提供任何安全功能,这意味着请求设备必须自行提供信息。不要将其用作安全系统,而应将其用作兼容性/弃用系统。
入门
要安装包,请运行
composer require imageplus/apivcs
您还应该发布配置以允许您进一步自定义设置。
php artisan vendor:publish --tag=imageplus-api-vcs-config
通过在您的环境变量中添加 VCS_ENABLED=true
来启用此功能。
请求参数
headers: [
...
Device-Type: ios,
Device-Version: 1.32.1-rc_final
]
设置全局API版本
此包可以配置为使用全局API版本(例如 /api/v1/...
,/api/v6/...
)。要增加版本,只需更新您的环境变量以包含以下键值,其中值是您的API的最新版本,例如:3
VCS_API_VERSION=3
如果您想删除旧版本,请参阅以下阻塞版本。
全局API版本只能为整数,且请求必须包含 /api/v{version_number}/{uri}
来使用它们。如果URL上未指定版本号,则默认为环境变量 VCS_API_DEFAULT_VERSION
。
注意:您无需指定您的API路由以接受版本控制。
警告:如果您使用全局版本,请勿在API内部进行重定向,否则您的请求将丢失提交的API版本。
设置设备和版本
在发布的配置文件中,您将能够配置您打算进行版本控制的设备。
'devices' => [ 'android' => 'Android', 'ps5' => 'Playstation 5' ]
一旦添加了设备,您需要在配置文件或使用环境变量覆盖(见以下ENV覆盖)中提供该设备的最低版本。
'minimum_version' => [ 'android' => '2.1.0', 'ps5' => '1.0.0' ],
默认情况下,必须提供设备类型和版本才能访问API。您可以使用 VCS_ALLOW_DEVICELESS_ACCESS
环境标志来更改此设置。
功能
如果您想将特定功能限制在特定的设备或版本数量上,您可以使用以下方式配置您的功能
'my_feature_key' => [ 'android' => '2.7.0', 'ps5' => '1.0.0|!1.3.*' ], 'no_android_access' => [ 'ps5' => '1.0.0' ]
通过使用版本助手,您可以标记特定版本或特定设备的最低版本。如果特定设备未在功能上设置,则它将无法访问该功能。
用法
外观
APIVersionValidator
这是一个版本比较器,主要用于辅助。它允许您比较给定版本,并可以作为ACL检查器。
APIVersionControl
此外观将帮助您根据请求中注册的设备创建条件。例如,假设您想根据设备提供json或XML资源。您可以使用以下方式
if (APIVersionControl::hasAccess('XML')) return Response::makeXML($resource); return Response::makeJSON($resource);
或向资源添加特定设备的其他属性
APIVersionControl::onlyDeviceVersion('ios', '!1.2.*', function () use ($resource) { $resource->valid_version = true; });
中间件
有三个路由中间件可以帮助您进一步自定义ACL。在您的 api.php
文件中,您可以使用这些中间件来阻止特定路由。
FeatureVersionMiddleware:仅允许具有访问指定功能的设备
//Only devices that support notifications Route::group([ 'name' => 'Notifications routes', 'prefix' => 'api/notifications', 'as' => 'notifications.', 'middleware' => 'feature:notifications' ], function (){ //All notification routes });
APIVersionMiddleware:使用版本助手来阻止或仅允许访问特定API版本
//This route only works on API version 1 Route::get('/api/user', [ 'as' => 'user.index', 'uses' => 'UsersController@index' ])->middleware('api_version:=1'); //This route works on any API version above or equal 2 Route::get('/api/profile', [ 'as' => 'profile', 'uses' => 'ProfileController@index' ])->middleware('api_version:2');
DeviceVersionMiddleware:使用版本助手来阻止或仅允许访问特定设备和版本
//This route only works on ios Route::get('/api/blob', [ 'as' => 'blob', 'uses' => 'BlobController@index' ])->middleware('device_version:ios,2.8.0'); //This route works on any version for playstation but only after 2.9.0 for iOS Route::get('/api/blobs', [ 'as' => 'blobs', 'uses' => 'BlobController@all' ])->middleware([ 'device_version:ps5,any', 'device_version:ios,2.9.0' ]);
阻止特定版本
您还可以使用配置中的locked_versions
来阻止特定设备版本或全局API版本。
'locked_versions' => [ 'global' => env('VCS_GLOBAL_BLOCK_VERSION', '2'), 'ios' => env('VCS_IOS_BLOCK_VERSION', '2.1.2, 2.1.6'), ]
这些版本之间用,
分隔,并且需要指定如上所示的精确版本。
环境覆盖
当配置文件中的env_override
为true时,大多数配置都可以在您的env
文件中覆盖。如果您缓存了配置,则此设置不会生效。以下是支持覆盖的正确语法:
VCS_{device_type}_MINIMUM_VERSION //Sets the minimum version for {device_type}
VCS_{device_type}_LOCKED_VERSION //Defines (and replaces) the locked versions for {device_type} Use GLOBAL for global api version
命令助手
您可以使用提供的命令来模拟特定设备的访问。
php artisan api:has-access --device=ios --device_ver=1.0.0-pre-alpha2
php artisan api:has-access --device=ps5 --device_ver=1.0.1-rcA --feature=profile
php artisan api:has-access --device=ios --device_ver=1.42.12 --api_ver=4