LaravelでCRUDのAPIをささっと作る

## はじめに

LaravelでWebのCRUDアプリケーションをささっと作る [Laravel5.6入門 基本CRUD操作を体で覚える](https://qiita.com/sayama0402/items/668f7148759910f65da9) という記事を書きましたが、その続きで、作ったコントローラーをそのままAPIにしてみようと思います。

## 前提

環境情報などは[こちら](https://qiita.com/sayama0402/items/668f7148759910f65da9)の記事を参照ください。
上記の記事の続きなので、上記の記事が一通り終わっていることが前提です。

## Controllers配下にApiディレクトリを作成する

`app/Http/Controllers`配下に`Api`ディレクトリを作成します。

`Api`ディレクトリ配下に作成した`ArticlesController.php`をコピーして配置します。

## api.phpにルーティングを設定する

APIのルーティングは`routes/api.php`に記述していきます。
`api.php`に以下を記述しましょう。

```php
<?php
Route::group(['middleware' => ['api']], function(){
  Route::resource('articles', 'Api\ArticlesController');
});
```

以上を行ったら、`php artisan route:list`でルーティングを確認します。

```
  Symfony\Component\Debug\Exception\FatalErrorException  : Class 'App\Http\Controllers\Api\Controller' not found

  at /Users/Laravel/form/app/Http/Controllers/Api/ArticlesController.php: 7
  3: namespace App\Http\Controllers\Api;
  4:
  5: use Illuminate\Http\Request;
  6: use App\Article;
  7: class ArticlesController extends Controller
  8: {
  9:     /**
  10:      * Display a listing of the resource.
  11:      *
  12:      * @return \Illuminate\Http\Response
```

すると上記のようなエラーが表示されました。

## コントローラーを修正していく

コピーした`ArticlesController.php`に問題があるので、修正をしていきます。
[こちら](https://qiita.com/sayama0402/items/6f79ebbfc71902da35b6)の記事にも書きましたが、`namespace`と`use`を足してあげます。

修正すると`ArticlesController.php`の上部は以下のようになります。

```php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Article;
use App\Http\Controllers\Controller;
```

こちらの状態で再度`php artisan route:list`を実行してみると以下のようにAPIのルーティングが設定されているかと思います。

![スクリーンショット 2018-02-19 12.15.38.png](https://qiita-image-store.s3.amazonaws.com/0/19716/e69e212d-793b-ebc8-f602-22ab7bcc3295.png)

## ルーティングを修正

APIはフォーマットをJSONだけを返すようにしたいので、viewが必要ありません。なので、処理でviewだけを返している`create`, `edit`は削ってしまいましょう。

`routes/api.php`を開き、以下を修正します。

```php
<?php
Route::group(['middleware' => ['api']], function(){
  Route::resource('articles', 'Api\ArticlesController', ['except' => ['create', 'edit']]);
});
```

`except`を使って`create`と`edit`のアクションはルーティングを生成しないように除外しました。

`php artisan route:list`で確認をすると除外されているのが、確認できます。
![スクリーンショット 2018-02-19 12.23.12.png](https://qiita-image-store.s3.amazonaws.com/0/19716/0022abd9-284f-19e2-bc94-cf2ad76de975.png)


## コントローラーのアクションを修正していく

エラーの解消と、ルーティングを設定出来たのですが、APIには必要のないアクションがあるので、それらを削除&修正していきます。

> `create`と`edit`の処理は削除してください。

格アクションを以下のように変更していきましょう！

#### index

```php
public function index()
{
  $articles = Article::all();
  return $articles;
}
```

#### store

```php
public function store(Request $request)
    {
      $article = new Article;
      $article->title = $request->title;
      $article->body = $request->body;
      $article->save();
      return redirect('api/articles');
    }
```

#### show

```php
public function show($id)
{
  $article = Article::find($id);
  return $article;
}
```

#### update

```php
public function update(Request $request, $id)
{
  $article = Article::find($id);
  $article->title = $request->title;
  $article->body = $request->body;
  $article->save();
  return redirect("api/articles/".$id);
}
```

#### destroy

```php
public function destroy($id)
{
  $article = Article::find($id);
  $article->delete();
  return redirect('api/articles');
}
```

## APIの動作を確認する

APIが動作しているかどうかを確認してみましょう。
`php artisan serve`でビルトインサーバーを起動しておきます。
APIの動作確認には、[Postman](https://www.getpostman.com/)を使いましょう。

#### 新規作成

記事をAPIで新規作成してみましょう。

Postmanを起動し、HTTPメソッドを`POST`にし、横のURL入力欄に`http://localhost:8000/api/articles`とします。
そしてタブメニューの`Body`で`key`と`value`を設定してSendを押すことでレコードを新規作成できます。

key | value 
--- | -----
title | ほげタイトル
body | ほげ内容

とか入れておきましょう

![スクリーンショット 2018-02-19 12.35.06.png](https://qiita-image-store.s3.amazonaws.com/0/19716/bd760be0-12cc-7692-1386-0ee512c08cd4.png)

入力するとこんな感じになるかと思います。

入力したら、右上の`Send`をクリックしましょう。すると、レコードが新規作成されているかと思います。

#### 一覧を確認

一覧の確認はHTTPメソッドを`GET`に変更し、`http://localhost:8000/api/articles`と入力したら、右上のSendをクリックすると下の方にJSONで一覧が返ってくるかと思います。

![スクリーンショット 2018-02-19 12.38.01.png](https://qiita-image-store.s3.amazonaws.com/0/19716/4574a100-cc65-3bfe-6fd9-367d850f1224.png)


#### 特定のidを取得

特定のidだけを取得するには、HTTPメソッドを`GET`でURLを`http://localhost:8000/api/articles/id`とすれば取得出来ます。

![スクリーンショット 2018-02-19 12.39.53.png](https://qiita-image-store.s3.amazonaws.com/0/19716/caa154d2-8180-08e7-25e9-1edd61a72505.png)

#### 特定のidの情報を更新

こちらに関しては、ちょっと微妙なのですが、なぜかHTTPメソッドのPUTを使用できず、POSTでやるやり方を説明いたします。
> PUTでの方法が分かる方はコメントいただければ幸いです

HTTPメソッドを`POST`URLを`http://localhost:8000/api/articles/id`で以下のようにします。

![スクリーンショット 2018-02-19 13.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/19716/0ac34bb5-5e32-2027-973c-0a44ecb8804e.png)

以上を見てみるとkeyに`_method`が設定され、valueに`PUT`が指定されています。
PUTでは更新出来ず、一度POSTでリクエストを出す必要がありました。。

#### レコードの削除

HTTPメソッドを`DELETE`、URLを`http://localhost/api/articles/id`でSendを押すだけで削除が出来ます！

![スクリーンショット 2018-02-19 13.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/19716/73c5234b-1923-ffe3-9237-e42460a0a6e4.png)


以上で完了です。