Laravelのルーティングは上から順番に読まれることを利用した小技です。
前提条件
- 一部APIに大幅な変更があり、APIのバージョンをあげて対応したい
- 旧APIはversion1として残したい
- クライアントからのアクセスはAPI単位ではなく、一括でversion2に切り替えたい
- 変更がないAPIに関してはversion1同様の処理をするようにしたい
- しかし、version1のControllerの処理をversion2にコピーして使いたくない
routes.phpの設定方法
Routeのpatternとgroupを組み合わせて定義します。
routes.php
<?php
// API version2の定義
Route::pattern('apiVersion2', 'v2');
Route::group(['namespace' => 'Api\V2', 'prefix' => '{apiVersion2}'], function() {
Route::get('example/show', 'UserController@show');
});
// API version2に未定義なrouteはv1のAPIを使う
// v1でもv2でもアクセスできるようにpattern定義する
Route::pattern('apiVersion1', 'v[12]');
Route::group(['namespace' => 'Api\V1', 'prefix' => '{apiVersion1}'], function() {
Route::get('example/show', 'ExampleController@show');
Route::post('example/delete', 'ExampleController@delete');
Route::post('example/register', 'ExampleController@register');
});
上記のように設定することにより、以下のようなルーティングを実現できる。
URI | controller |
---|---|
/v2/example/show | Api\V2\ExampleController@show |
/v1/example/show | Api\V1\ExampleController@show |
/v1/example/register | Api\V2\ExampleController@register |
/v2/example/register | Api\V1\ExampleController@register ※ |
※ apiVersion2のRoute::groupに定義がないので、apiVersion1の定義が有効になる。 |
Controllerはversionごとにディレクトリを分けておくといい感じです。
/controllers
/api
/v1
/ExampleController.php
/v2
/ExampleController.php