July 11, 2021 • ☕️ 4 min read
Laravel で APIのバージョン管理をする場合、どんな方法がいいのだろう。
と思い、オープンソースを参考にしてみる事にした。
ちなみに、APIのバージョン管理、↓のような感じ。
https://qiita.com/api/v2/items
※「v2」がバージョン番号
以下、Laravel を使用したオープンソースを適当にピックアップして調査してみました。
調査対象の基準は、
『リポジトリ内を「v1」「v2」というキーワードで検索して、何かしらのファイルがヒットしたか』
一見、バージョン管理してるっぽく見えたけど、管理しているのは old ファイルのみ?
特にプロダクトとして組み込んでいるわけでは無さそう。
https://github.com/monicahq/monica
‘us1.locationiq.com/v1/’ という固定文字があったが、それ以外は特に無し。
特に参考になる内容は無さそう。
https://github.com/jsdecena/laracom
‘v1’ という記述があったが、単に CDN をコールしているだけだった。
https://github.com/octobercms/october
検索に引っかかったのはコメントのみ。
https://github.com/wells/airflix
ようやくそれっぽいのが見つかった。
「v1」という階層を設け、そこにファイルを格納していく、という方法。
バージョンが上がるごとに、無関係なファイル(変更が加えれれなかったファイル)もどんどん増えて行くのか・・・?
それはちょっと避けたい。
「$resourceVersion = 1.0」という変数があるが、詳細は未調査。
バージョンアップの影響が、今後も限定的に留められるアプリならまだしも、バージョンアップの影響範囲が今後も読めないプロダクトで実施すると、後で酷い目に遭いそう。
良く考えたら、オープンソースなんて個人または少数の開発者が趣味でやってるのが大半だし、そうなると APIのバージョン管理なんて面倒な事、誰もしたくないよね。
こんなのが必要なのは、きっかりした会社の正式プロダクトだ。
という事で、オープンソースはあまり参考にならなさそう。
という事で、他の方法を調べてみた。
Versioning your REST API with Laravel
泥臭く頭捻りながら考え出すしか無さそう。
結局、「v1 と v2 の挙動を if文で分岐する」みたいな実装になるのだろうか。
「v2 を追加したら、v1 がバグった!」という事態になるのは仕組みとして防止したいので、ソースコードレベルから分離するのが理想なんじゃないか(v2 の挙動は、v1 の挙動に一切影響を受けない構造が望ましいのではないか)と思ったが、そうすると似たようなソースが次々と生産され、無駄にソースが肥大化していくので、それは避けたい。。
となると、v1 と v2 の挙動を分岐処理なりインタフェースなりファクトリメソッドなりで差異を表現するのがベターか。
なら重要なのはテストコードを書く事と、テストコードが書きやすい実装にする事だな。