目的
PHPでRestfulなWebApiのバージョン管理についての実装方法の考察
経緯
webアプリを作ろうって思った際に、phpでwebapiを作成することになりました。Restfulを採用してやろうと思ったが、バージョン管理をどうしようと。
注釈
- 使用フレームワークはLaravel5.3
- 今回のapiは公開用ではない
- version情報はurlへ埋め込む方式。例:
/v1/messages/:messageId
考え1
ルーティングで参照するディレクトリを分けて、Controllers/下のディレクトリ構造をこんな感じにしてやったら良いんじゃないか?
こんな感じ
app/
┠ HTTP/
│ ┠ Controllers/
│ │ ┠ v1/
│ │ ┠ v2/
│ │ ┠ Auth/
│ │ └ Kernel.php
│ ┠ Middleware
結果: Middlewareなどに更新が入ることは滅多にないが、Middlewareを修正したり、Authを修正したりする際に、v1とv2、両方に影響を与えてしまう可能性が非常に高い。
考え2
ルーティングで参照するディレクトリを分けて、HTTP/下のディレクトリ構造をこんな感じにしてやったら良いんじゃないか?
こんな感じ
app/
┠ HTTP/
│ ┠ v1/
│ ┠ v2/
│ │ ┠ Controllers/
│ │ ┠ middleware/
│ │ └ Kernel.php
結果:メジャーバージョンはよさげ。
考え2−1
では、マイナーバージョンアップの際はどうする?ちょっとやり方を統一してみよう。
app/
┠ HTTP/
│ ┠ v1/
│ ┠ v2/
│ │ ┠ 001
│ │ ┠ 010
│ │ │ ┠ Controllers/
│ │ │ ┠ middleware/
│ │ │ └ Kernel.php
結果:こりゃあ酷いorz
そもそも私が欲しいのは、Gitのbranch機能的な奴なんだよ!
考え2−2
そもそもマイナーバージョンはAccept: application/json; version=010
などで指定可能な様にしようと思っていて、指定しない場合は、自動的に最新のマイナーバージョンを適用する。では、api内でif文で対応するか。。。
結果:まぁ、普通。
考え3
そもそも自分で作ったサービスでしか使用しないapiで、他人に提供する予定ないし、その場合は古いバージョンのapiは完全に使用しないし。この場合、Gitで普通に管理した方が良いんじゃないか?
master/
┠ v1/
│ └ dev/
┠ v2/
│ └ dev/
結果:まぁ、普通。。。
結論
Gitは素晴らしい。公開する予定のあるapiの場合は、考え2-2が良いのかなって思っています。
しかし、世の中素晴らしいアーキテクチャが沢山あるので、もし意見やアドバイスがある場合、些細なことでも良いのでコメント頂けると幸いです。
参考サイト
- http://qiita.com/shrkw/items/c6123ca25981e44a3d82
- http://qiita.com/takeokunnn/items/c119e576a6c04d37e098
- http://qiita.com/suin/items/f7ac4de914e9f3f35884
- http://qiita.com/mserizawa/items/b833e407d89abd21ee72
- http://e-words.jp/w/%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97.html