laravel でAPI作成

#LaravelでAPIを作成する
CRUDとか、ルーティングとか、なんとなくはわかってるけど、
「APIを叩く」と言われても、APIを…叩く…？というレベルでピンとこない初学者が
とりあえず見様見真似でAPIを作成したので備忘録。
#API作成の手順
**1. テーブル（マイグレーションファイル）を作る**
**2. モデルを作る**
**3. コントローラーを作る**
**4. APIのルーティングを追加する**

案外これだけ。API作るってどんなけ難しいんや…と思ってましたが
普通の実装となんら変わらんでした。データをJSON形式で返すのでViewは不要。

#1. テーブル作成
早速、順を追って作成していきます。
今回はサーバ側でバージョン管理用のテーブルを作成して、
そのデータを別媒体でも取得できるような簡単なAPIを作成しました。

```
$ php artisan make:migration create_ver_table
```
migrationファイルの中身はこんな感じ。
最新バージョンと最低バージョンあればいいでしょってことでカラムは至ってシンプルに。

```ruby:create_ver_table.php
    public function up()
    {
        Schema::create('ver', function (Blueprint $table) {
            $table->increments('id');
            $table->string('version');
            $table->string('min_version');
            $table->timestamps();
        });
    }
```
migration 実行してテーブル作ります。

```
$ php artisan make:migrate
```

#2. モデル作成
テーブルが作成できたら作ったテーブルのデータにアクセスするためにモデルを作ります。

```
$ php artisan make:model Ver
```
```ruby:Ver.php
class Ver extends Model
{
    protected $table = 'ver';
    protected $dates =  ['created_at', 'updated_at'];
    protected $fillable = ['id', 'version', 'min_version'];
}
```

#3. コントローラー作成
コントローラ を作って処理を書いていきます。
`make:controller`コマンド実行時に、引数に`--api`を入れると
APIに不要なメソッドを除外した状態でリソースコントローラーを作ってくれるらしいです。
今回はindexメソッドしか使わないので普通にコマンド実行。

```
$ php artisan make:controller API/VerController
```

```ruby:Controller
use App\Ver;   // 追加

class VerController extends Controller
{
    public function index()
    {
       try {
            $version = Ver::first();
            $result = [
                'result'      => true,
                'version'     => $version->version,
                'min_version' => $version->min_version
            ];
        } catch(\Exception $e){
            $result = [
                'result' => false,
                'error' => [
                    'messages' => [$e->getMessage()]
                ],
            ];
            return $this->resConversionJson($result, $e->getCode());
        }
        return $this->resConversionJson($result);
    }

    private function resConversionJson($result, $statusCode=200)
    {
        if(empty($statusCode) || $statusCode < 100 || $statusCode >= 600){
            $statusCode = 500;
        }
        return response()->json($result, $statusCode, ['Content-Type' => 'application/json'], JSON_UNESCAPED_SLASHES);
    }
}
```
`$versions = Ver::first();`：verテーブルのデータの最初の一つだけ取得。
　　　　　　　　　　　　　　　　　データが複数の場合は全取得にしてforeach処理が必要。
`$result = [...]`：APIで送りたいデータをこの中で定義しています。
`return response()->json(...);`：結果をjsonに変換する処理。
`JSON_UNESCAPED_SLASHES`：こいつでスラッシュのエスケープを抑止できるようです。

#4. ルーティング追加
ここまで来たらあと一息。ルーティングを追加します。
APIのルーティングは`routes/api.php`に記載します。

```ruby:api.php
 Route::get('ver','API\VerController@index');
```

設定したurlにアクセスして、APIの中身が確認できたらAPI作成完了です。
↑の場合だと[http://localhost/api/ver](http://localhost/)にアクセスしたら画面にこんな感じで表示されます。
　　{"result":true,"version":"1.1.1","min_version":"1.1.0"}
これがいわゆる「API叩く」ってことらしいです。

振り返ってみると簡単な気もするけどまだ理解しきれていない部分もあって難しい...
以上でした！

#参考サイト
- [LaravelでCRUDのAPIをささっと作る](https://qiita.com/sayama0402/items/0188c740360479db3f98)
- [作成してみよう！LaravelでAPIを扱う方法【初心者向け】](https://techacademy.jp/magazine/18786)
- [【PHP入門】Exceptionクラス徹底解説!例外をthrowしてtry~catchする](https://www.sejuku.net/blog/24907)