EC2のLaravel6.0環境でRest APIを準備する　AWS/Laravel連載(9)

# はじめに

前回の記事でBladeテンプレートを学びました。

[EC2のLaravel6.0環境のBladeテンプレートの基礎を学ぶ　AWS/Laravel連載(8)](https://qiita.com/rf_p/items/63d1d49b9dcaee9df02d)

今回はRest APIを作ります。
ちなみに次回でVue.jsを使いテンプレートに表示をします。


# モデル、コントローラー、マイグレーションファイルを作る

```powershell
$ php artisan make:model -mcr Post
```

上記コマンドで、

- app/Post.php（モデル）
- app/Http/Controllers/PostController.php(コントローラー)
- database/migrations/20xx_xx_xx_xxxxxx_create_posts_table.php(マイグレーションファイル）

が出来上がります。

# ルーティングの追加

routes/api.phpに以下１行を追加します。

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

するとAPI用のルーティングが作られます。

```powershell
$ php artisan route:list --path=posts
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
| Domain | Method    | URI              | Name          | Action                                      | Middleware |
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
|        | GET|HEAD  | api/posts        | posts.index   | App\Http\Controllers\PostController@index   | api        |
|        | POST      | api/posts        | posts.store   | App\Http\Controllers\PostController@store   | api        |
|        | GET|HEAD  | api/posts/{post} | posts.show    | App\Http\Controllers\PostController@show    | api        |
|        | PUT|PATCH | api/posts/{post} | posts.update  | App\Http\Controllers\PostController@update  | api        |
|        | DELETE    | api/posts/{post} | posts.destroy | App\Http\Controllers\PostController@destroy | api        |
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
```

# マイグレーションファイルの修正

xx部分には作成日時が入るので適宜読み換えてください。

```php:20xx_xx_xx_xxxxxx_create_posts_table.php
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->text('content');
            $table->timestamps();
        });
    }
```

title, contentという２カラムを追加した状態でテーブルを作ります。
timestampsはcreated_at, updated_atという２カラムが自動で追加され、レコード生成日時がcreated_atに、最終更新日時がupdated_atに入るようになります。原則入れることになるかと思います。

```powershell
$ php artisan migrate
```

# シーディングの設定

テーブルはできましたがレコードがありません。
動作確認がしづらいので、初期レコードを生成しましょう。

```powershell
$ php artisan make:seeder PostsTableSeeder
```

```php:database/seeds/PostsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PostsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('posts')->insert([
            'title' => 'hoge',
            'content' => 'fuga',
        ]);
    }
}
```

```php:database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(PostsTableSeeder::class);
    }
}
```

```powershell
$ php artisan db:seed
Seeding: PostsTableSeeder
Database seeding completed successfully.
```

レコードが発行されたかtinkerで調べてみましょう。

```powershell
$ php artisan tinker
>>> Post::all();
[!] Aliasing 'Post' to 'App\Post' for this Tinker session.
=> Illuminate\Database\Eloquent\Collection {#3087
     all: [
       App\Post {#3088
         id: 1,
         title: "hoge",
         content: "fuga",
         created_at: null,
         updated_at: null,
       },
     ],
   }
```

hoge, fugaという決め打ちではなく、FakerとFactoryという仕組みでダミーデータを生成する方法も別記事で紹介しています。
気になる方は以下記事を参照してください。
[EC2のLaravel6.0環境 VueとLaravelでのTIPS　AWS/Laravel連載(10.5)](https://qiita.com/rf_p/items/963553a83e13f776f02d)

# コントローラーの設定

```php
<?php

namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return Post::latest()->paginate();
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        return Post::create($request->all());
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function show(Post $post)
    {
        return $post;
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Post $post)
    {
        $post->update($request->all());
        return $post;
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function destroy(Post $post)
    {
        $deleted = $post->delete();
        return compact('deleted');
    }
}
```

LaravelはEloquentオブジェクトをreturnするとjsonで返してくれる模様。
上記設定ができたら、Webブラウザでアクセスしてみます。
http://【EC2インスタンスのIP】/api/posts

```json
{"current_page":1,"data":[{"id":1,"title":"hoge","content":"fuga","created_at":null,"updated_at":null}],"first_page_url":"http:\/\/【EC2インスタンスのIP】\/api\/posts?page=1","from":1,"last_page":1,"last_page_url":"http:\/\/【EC2インスタンスのIP】\/api\/posts?page=1","next_page_url":null,"path":"http:\/\/【EC2インスタンスのIP】\/api\/posts","per_page":15,"prev_page_url":null,"to":1,"total":1}
```

参考：
[Laravel × Vue.js × axiosでTODOリストを作るよ！ その1
](https://tonyo.design/program/vue-js/todo-list_with_laravel_vue_axios_no1/)