【Laravel】登録・取得・更新・削除が出来るシンプルなAPIサーバを作る

##俺はLaravelをAPIサーバとして使いたいんだ！！
フロントエンドとバックエンドの連携って結構大変ですよね。
でもバックエンドのLaravelをAPIとして実装する事が出来ればシンプルにJSON形式でDBとやりとりができる！素晴らしい。。。

というわけで今回はタイトルと内容がある投稿(Post)をDBに登録や引き出し、更新、削除する、所謂CRUD(Create Read Update Delete)機能を持ったAPIサーバーをLaravelで実装していきます。認証にはapi_tokenを使用しています。

##環境
Laravel 5.6以上
Mysql 5.6以上
Postman
Mysql Workbench

##話さない事
記事が長くなってしまう為、下記については今回話しません。
興味がある方は別記事にて解説しているのでリンクをご参照ください。

- api_tokenを使った認証
- FactoryやSeederを使ったダミーデータの作成

##事前準備
事前準備としてテーブルの用意をします。

usersテーブルとpostsテーブルのmigrationファイルを準備し、`artisan migrate`でテーブルを作成しましょう。

postsテーブルのmigrationファイルを準備します。作るカラムは投稿id、タイトル、本文、投稿者名、投稿時間の5つです。

```bash:bash
$ php artisan make:migration create_posts_table
```

上記でposts用のmigrationテーブルが作成出来たら、

```php:database/migrations/create_posts_table
Schema::create('posts',function(Blueprint $table)){
    $table->increments('id');
    $table->text('title');
    $table->text('post');
    $table->string('user_name');
    $table->dateTime('created_at');
});

```
上記の通り、各カラムを定義、

```bash:bash
$ php artisan migrate
```
でテーブルを作成。



##導入手順
単純な手順としては、
1. モデルを作る
2. コントローラーを作る
3. `route/api.php`でルーティングをする
4. `config/auth.php`のガード設定を書き換える
以上です。

###1.モデルを作る
投稿を操作するPostモデルを準備しましょう。

```bash:bash
$ php artisan make:model Post
```
で投稿モデルを作成。

```diff:app/Post.php
class Post extends Model
{
+   protected $fillable = [
+       'title',
+       'post',
+   ];
}
```
`$fillable`にて投稿時に記入出来る項目を定義します。

###2.コントローラーを作る
次にPostControllerを準備しましょう。

```bash:bash
$ php artisan make:controller PostController --api
```

コントローラーのファイル名の後に`--api`パラメーターを付けると以下のようにRESTfulに対応したメソッドを持つコントローラーが作成されます。

注意：apiリソースコントローラーを作成出来る様になったのはLaravel5.6以降なのでそれ以前のバージョンを使用の場合は`--resource`パラメーターで作成してください。

```php:app/Http/Controllers/PostController.php
class PostController extends Controller {
     //一覧取得
     public function index(){  }
     
     //新規作成
     public function store(Request $request){  }

     //1件取得
     public function show(Post $post){  }

     //更新
     public function update(Request $request, Post $post){  }

     //削除
     public function destroy(Post $post){  }

```

ここの中から今回は一覧取得、新規作成、１件取得を実装していきます。
前後しますが、まずstoreメソッド(新規作成)から

```diff:app/Http/Controllers/PostController.php
public function store(Request $request)
{
+   $post = new Post();
+   $post->fill($request->all());
+   $uname = auth()->user()->name;
+   $post->user_name = $name;
+   $post->save();
+   return $post;
} 
```

次にindexメソッド(一覧取得)、

```diff:app/Http/Controllers/PostController.php
public function index()
{
+   $uname = auth()->user()->name;
+   return Post::where('user_name',$uname)->get();
} 
```
showメソッド(一件取得)、

```diff:app/Http/Controllers/PostController.php
public function show(Post $post)
{
+   return Post::find($post);
} 
```

updateメソッド(更新)、

```diff:app/Http/Controllers/PostController.php
public function update(Request $request, Post $post)
{
+    $post->fill($request->all());
+    $post->save();
+    return $post;
} 
```

deleteメソッド(削除),

```diff:app/Http/Controllers/PostController.php
public function destroy(Post $post)
{
+   $post->delete();
+   return $post;
} 
```

###3.ルーティングをする
次にルーティングを整えます。

```diff:routes/api.php
+   Route::apiResource('posts','PostController');
```

###4.ガードの設定を変える
認証に使うガードの設定を変更しましょう。

```diff:config/auth.php
'defaults' => [
-   'guards' => 'web',
+   'guards' => 'api',
    'passwords' => 'users',
], 
```

##完成！！
これで投稿を登録、取得、一覧、更新、削除をリクエストに応じて処理してくれるAPIサーバが実装出来ました。

確認にはAPI開発の便利ツール[Postman](https://www.getpostman.com/)とMySQLビジュアルツールの[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)が便利です。

Postmanを使ったCRUD機能の確認については別記事で解説したいと思いますが、CRUD機能はどんなサービスでも使う基本的な機能なので、ここまで出来れば大抵のサービスは作れてしまうので是非覚えていってもらえればと思います。


続く。。。



###参考にしたサイト
https://readouble.com/laravel/5.6/ja/facades.html
https://qiita.com/sayama0402/items/0188c740360479db3f98
https://qiita.com/MasaKu/items/82b9743383e73cb62c3e
https://www.webopixel.net/php/1454.html