我正在开发一个PHP
SOAP
API
。此API
应该能够处理多个接口版本。为此,我正在对数据结构进行版本控制,例如:
- 结构V1用户
- 结构V1组
。过了一段时间...
- 结构V2用户
- 结构V2组
新数据结构不会覆盖旧数据结构。多个API
接口版本应同时工作。
在 API
接口的第一个版本中,操作如下所示:
User userGet(int id)
它返回一个具有以下结构的对象:
User {
int id;
string username;
int created;
int updated;
}
假设一段时间后,从结构中删除了一些属性,并添加了其他属性(在此示例中操作签名不会更改):
User {
int id;
string username;
int updated;
bool admin;
}
因此,如果数据库已更改并且字段created
不再存在,则应null
。旧客户端应检查空值。
笔记:
- 该
API
interface
将有多个版本 - 数据库随时间的变化
- 每个版本都有自己的
URL
、WSDL
和proxy class
如何创建适用于多个结构版本的查询系统?
是否有任何已知的方法?
因为它是一个肥皂 Api,所以你不能在更新结构时给他们一个全新的 URL 吗?
我的第一种方法是传递callback
为每一行调用的函数,并根据需要转换数据:
这是入口点:
function userGet($id){
return UserModel::getUserById($id, 'myCallback'); /* Query system */
}
。在回调中:
function myCallback($dbRow){
$row = new StructV1User;
$row->id = (int) $dbRow['id'];
$row->username = (string) $dbRow['username'];
$row->created = (int) $dbRow['created'];
$row->updated = (int) $dbRow['updated'];
return $row;
}
。对于 API 的第二个版本:
function userGet($id){
return UserModel::getUserById($id, 'my2ndCallback'); /* Query system */
}
。在回调中:
function my2ndCallback($dbRow){
$row = new StructV2User;
$row->id = (int) $dbRow['id'];
$row->username = (string) $dbRow['username'];
$row->updated = (int) $dbRow['updated'];
$row->admin = (boolean) $dbRow['admin'];
return $row;
}