読者です 読者をやめる 読者になる 読者になる

【fuelphp】APIバージョンを意識したAPI設計について考えてみた

fuelphp php

はじめに

アプリリリース後にバグが見つかり、アプリ(ios,androidoともに)とAPIを改修する必要がある場合がありました。
対応としては
1. アプリを強制アップデートさせる(最新バージョンでないとアプリを使えないようにする)
2. 過去のアプリのバージョンと最新バージョンとどちらでもアプリを使用できるようにする

ということを考えたのですが、お客さんが強制アップロードは避けたいということで2.の形で対応する必要がありました。
で、アプリのバージョンごとにAPIを用意する必要がありました。

今回はAPIにversion1と2を用意して、アプリ側もこのversionに合わせてAPIのurlをきりかえるということを考えました。

現状

http://example.com/get_user # API① ユーザー情報を取得するAPI
http://example.com/update_user # API② ユーザー情報を更新するAPI

上記のようなAPIがあったとして、今回API①を改修したいと考えます。

改善案

http://example.com/v2/user/get
http://example.com/v1/user/update

このような形を考えたのですが、APIによってv1とv2をアプリ側で切り替えるというのは複雑になります

さらに改善案

// アプリのversion1はこちらにアクセス
http://example.com/v1/user/get
http://example.com/v1/user/update

// アプリのversion2はこちらにアクセス
http://example.com/v2/user/get
http://example.com/v2/user/update

この形が1番すっきりしそうです。
で、この形にした場合にget_userは改修があるのでそれぞれコードがわかれる形で問題ないと思います。
が、update_userについてはv1もv2も全く同じコードとなってこれを二重で管理するというのが今回やりたかったことです

実装

構成はこのような形

project
├── fuel
│   ├── app
│   │  ├── v1
│   │  │  ├── user.php
│   │  │  ・・・
│   │  ├── v2
│   │  │  ├── user.php
│   │  │  ・・・

controller/v1/user.php

<?php
class Controller_V1_User extends Controller
{
    public function action_get() {
        ・・・
    }

    public function action_update() {
        ・・・
    }
}

controller/v2/user.php

<?php
class Controller_V2_User extends Controller_V1_User
{
    public function action_get() {
        ・・・
    }
}

どうするのが1番いいのかわからないけど、こんな感じがいいのかな、、、

以上です