【问题标题】:Querying system that works with multiple versions of structures?查询系统适用于多个版本的结构?
【发布时间】:2023-12-19 23:44:02
【问题描述】:

我正在PHP 中开发SOAP API。这个API 应该能够处理多个接口版本。为此,我正在对数据结构进行版本控制,例如:

  • StructV1User
  • StructV1Group

...过了一段时间...

  • StructV2User
  • StructV2Group

新数据结构不会覆盖旧数据结构。多个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。老客户应该检查空值。

注意事项:

  • APIinterface 将有多个版本
  • 数据库随时间变化
  • 每个版本都有自己的URL、自己的WSDL和自己的proxy class

如何创建适用于多个版本结构的查询系统?

是否有任何已知的方法?

【问题讨论】:

    标签: php api versioning


    【解决方案1】:

    因为它是一个肥皂 API,你不能在更新结构时给他们一个全新的 URL 吗?

    【讨论】:

    • 我正在这样做,但后面我使用的是相同的代码库,否则如果数据库发生更改,我应该更新所有以前版本的 API。
    【解决方案2】:

    我的第一种方法是传递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;
    }
    

    【讨论】: