k.watanabe技術者ブログ

k.watanabe

小説投稿用のAPIの作成

はじめに

今回は小説を投稿するためのAPIを作成してみました。APIの要件は以下のようになっています。


■要件

テーブルは以下のような構成になっています。


■テーブル構成

手順1: modelとControllerとmigrationファイルの作成

小説なのでnovelsという名前のテーブルにしました。


Laravel8からはオプションに-mcrを付けることで一度にモデルとコントローラーとマイグレーションファイルを作成できます。


  1. $ php artisan make:model Novel -mcr

migrationファイル

  1.  public function up()
  2.     {
  3.         Schema::create('novels', function (Blueprint $table) {
  4.             $table->id();
  5.             $table->string('title');
  6.             $table->string('content');
  7.                         $table->string('category');
  8.             $table->timestamps();
  9.         });
  10.     }

migration実行

  1. $ php artisan migrate

手順3:モデルクラスの編集

ポイント $fillableの配列にカラムを指定することでモデルクラスから登録や更新が出来るようになります。追加するのは登録するのを許可するという意味になります。


  1. class Novel extends Model
  2. {
  3.     use HasFactory;
  4.     // fillableに指定したプロパティは入力可能になる
  5.     protected $fillable = [
  6.     'title',
  7.     'content',
  8.     'category'
  9.     ];
  10. }


ちなみに登録させたくない場合はguardedに追加します。

  1. 例:
  2. protected $guarded = ['created_at', 'updated_at'];
  3. }

手順4:ルーティングの設定

APIなのでroutes/api.phpに記載します。

  1. Route::middleware(['middleware' => 'api'])->group(function () {
  2.     Route::controller(NovelController::class)->group(function () {
  3.         Route::post('/novels/create', 'create');
  4.         Route::get('novels', 'index');
  5.         Route::get('/novels/{novel}', 'show');
  6.         Route::patch('/novels/update/{novel}', 'update');
  7.         Route::delete('/novels/{novel}', 'destroy');
  8.     });
  9. });


手順5: コントローラーの編集

■ ポイント

createやshowメソッドで引数にモデルクラスを指定しています。これはルーティングにIDを含めることで暗黙の結合をしています。このように書くことでfindでIDからデータを取得する手間を省くことが出来ます。


  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Models\Novel;
  4. use Illuminate\Http\Request;
  5. use App\Http\Controllers\Controller;
  6. class NovelController extends Controller
  7. {
  8.     /**
  9.      *
  10.      * @return \Illuminate\Http\Response
  11.      */
  12.     public function index()
  13.     {
  14.         $novels = Novel::all();
  15.         return response()->json($novels);
  16.     }
  17.     /**
  18.      * Show the form for creating a new resource.
  19.      *
  20.      * @return \Illuminate\Http\Response
  21.      */
  22.     public function create(Request $request, Novel $novel)
  23.     {
  24.       $novel->create($request->all());
  25.         return response()->json(Novel::all());
  26.     }
  27.     /**
  28.      * Store a newly created resource in storage.
  29.      *
  30.      * @param \Illuminate\Http\Request $request
  31.      * @return \Illuminate\Http\Response
  32.      */
  33.     public function store(Request $request)
  34.     {
  35.         //
  36.     }
  37.     /**
  38.      * Display the specified resource.
  39.      *
  40.      * @param \App\Models\Novel $novel
  41.      * @return \Illuminate\Http\Response
  42.      */
  43.     public function show(Novel $novel)
  44.     {
  45.         return response()->json($novel);
  46.     }
  47.     /**
  48.      * Show the form for editing the specified resource.
  49.      *
  50.      * @param \App\Models\Novel $novel
  51.      * @return \Illuminate\Http\Response
  52.      */
  53.     public function edit(Novel $novel)
  54.     {
  55.         //
  56.     }
  57.     /**
  58.      * Update the specified resource in storage.
  59.      *
  60.      * @param \Illuminate\Http\Request $request
  61.      * @param \App\Models\Novel $novel
  62.      * @return \Illuminate\Http\Response
  63.      */
  64.     public function update(Request $request, Novel $novel)
  65.     {
  66.         $novel->update($request->all());
  67.         return response()->json($novel);
  68.     }
  69.     /**
  70.      * Remove the specified resource from storage.
  71.      *
  72.      * @param \App\Models\Novel $novel
  73.      * @return \Illuminate\Http\Response
  74.      */
  75.     public function destroy(Novel $novel)
  76.     {
  77.         $novel->delete();
  78.         return response()->json(Novel::all());
  79.     }
  80. }


手順6: postmanで動作確認

一通り実装出来たのでpostmanを使って動作確認をしていきます。postmanはAPIをテストするのに便利なツールです。


1 一覧表示の同作確認

routes/api.php

  1. Route::middleware(['middleware' => 'api'])->group(function () {
  2.     Route::controller(NovelController::class)->group(function () {
  3.         Route::post('/novels/create', 'create');
  4.         Route::get('novels', 'index');
  5.         Route::get('/novels/{novel}', 'show');
  6.         Route::patch('/novels/update/{novel}', 'update');
  7.         Route::delete('/novels/{novel}', 'destroy');
  8.     });
  9. });

app/Http/Api/NovelController.php

  1. /**
  2.      *
  3.      * @return \Illuminate\Http\Response
  4.      */
  5.     public function index()
  6.     {
  7.         $novels = Novel::all();
  8.         return response()->json($novels);
  9.     }

postmanでURLを叩いて実行。登録済のデータが返ってきたことを確認出来ました。

postman

2 新規登録の同作確認

  1. /**
  2.      * Show the form for creating a new resource.
  3.      *
  4.      * @return \Illuminate\Http\Response
  5.      */
  6.     public function create(Request $request, Novel $novel)
  7.     {
  8.       $novel->create($request->all());
  9.         return response()->json(Novel::all());
  10.     }

新規登録も問題なく動作確認が出来ました。

postman2

3 showメソッドの同作確認

  1. /**
  2.      * Display the specified resource.
  3.      *
  4.      * @param \App\Models\Novel $novel
  5.      * @return \Illuminate\Http\Response
  6.      */
  7.     public function show(Novel $novel)
  8.     {
  9.         return response()->json($novel);
  10.     }

先ほど新規登録したid5を指定すると結果が問題なく返ってきています。

postman3

4 updateメソッドの同作確認

  1.  /**
  2.      * Update the specified resource in storage.
  3.      *
  4.      * @param \Illuminate\Http\Request $request
  5.      * @param \App\Models\Novel $novel
  6.      * @return \Illuminate\Http\Response
  7.      */
  8.     public function update(Request $request, Novel $novel)
  9.     {
  10.         $novel->update($request->all());
  11.         return response()->json($novel);
  12.     }

先ほど新規登録したid5を更新処理テストにして実行した所、問題なく更新が実行されました。

postman4

5 destroyメソッドの同作確認

  1. /**
  2.      * Remove the specified resource from storage.
  3.      *
  4.      * @param \App\Models\Novel $novel
  5.      * @return \Illuminate\Http\Response
  6.      */
  7.     public function destroy(Novel $novel)
  8.     {
  9.         $novel->delete();
  10.         return response()->json(Novel::all());
  11.     }

id5を削除するように指定したので、削除された結果が返ってきたことを確認出来ました。

postman5
記事一覧に戻る

プロフィールに戻る