0

私はで開発してSOAP APIPHPます。これ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。古いクライアントはnull値をチェックする必要があります。

ノート:

  • 複数のバージョンがありますAPI interface
  • データベースは時間とともに変化します
  • 各バージョンには、独自のURL、独自のWSDL、および独自のがありますproxy class

複数のバージョンの構造で動作するクエリシステムを作成するにはどうすればよいですか?

これに対する既知のアプローチはありますか?

4

2 に答える 2

0

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の2番目のバージョンの場合:

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;
}
于 2012-06-04T13:10:04.973 に答える
0

これは SOAP Api であるため、構造を更新するときにまったく新しい URL を提供することはできませんか?

于 2012-06-04T13:16:24.957 に答える