小説投稿用のAPIの作成
はじめに
今回は小説を投稿するためのAPIを作成してみました。APIの要件は以下のようになっています。
■要件
- ・小説のタイトルと本文とジャンルを新規作成するCreate
- ・登録されている小説を一覧表示するRead
- ・選択した小説の内容を表示するShow
- ・投稿した小説を編集する Update
- ・投稿した内容を削除するDelete
テーブルは以下のような構成になっています。
■テーブル構成
- ・タイトル
- ・本文
- ・カテゴリ
- ・作成日
- ・更新日
手順1: modelとControllerとmigrationファイルの作成
小説なのでnovelsという名前のテーブルにしました。
Laravel8からはオプションに-mcrを付けることで一度にモデルとコントローラーとマイグレーションファイルを作成できます。
- $ php artisan make:model Novel -mcr
migrationファイル
- public function up()
- {
- Schema::create('novels', function (Blueprint $table) {
- $table->id();
- $table->string('title');
- $table->string('content');
- $table->string('category');
- $table->timestamps();
- });
- }
migration実行
- $ php artisan migrate
手順3:モデルクラスの編集
ポイント $fillableの配列にカラムを指定することでモデルクラスから登録や更新が出来るようになります。追加するのは登録するのを許可するという意味になります。
ちなみに登録させたくない場合はguardedに追加します。
- 例:
- protected $guarded = ['created_at', 'updated_at'];
- }
手順4:ルーティングの設定
APIなのでroutes/api.phpに記載します。
手順5: コントローラーの編集
■ ポイント
createやshowメソッドで引数にモデルクラスを指定しています。これはルーティングにIDを含めることで暗黙の結合をしています。このように書くことでfindでIDからデータを取得する手間を省くことが出来ます。
手順6: postmanで動作確認
一通り実装出来たのでpostmanを使って動作確認をしていきます。postmanはAPIをテストするのに便利なツールです。
1 一覧表示の同作確認
routes/api.php
- Route::middleware(['middleware' => 'api'])->group(function () {
- Route::controller(NovelController::class)->group(function () {
- Route::post('/novels/create', 'create');
- Route::get('novels', 'index');
- Route::get('/novels/{novel}', 'show');
- Route::patch('/novels/update/{novel}', 'update');
- Route::delete('/novels/{novel}', 'destroy');
- });
- });
app/Http/Api/NovelController.php
- /**
- *
- * @return \Illuminate\Http\Response
- */
- public function index()
- {
- $novels = Novel::all();
- return response()->json($novels);
- }
postmanでURLを叩いて実行。登録済のデータが返ってきたことを確認出来ました。
2 新規登録の同作確認
- /**
- * Show the form for creating a new resource.
- *
- * @return \Illuminate\Http\Response
- */
- public function create(Request $request, Novel $novel)
- {
- $novel->create($request->all());
- return response()->json(Novel::all());
- }
新規登録も問題なく動作確認が出来ました。
3 showメソッドの同作確認
- /**
- * Display the specified resource.
- *
- * @param \App\Models\Novel $novel
- * @return \Illuminate\Http\Response
- */
- public function show(Novel $novel)
- {
- return response()->json($novel);
- }
先ほど新規登録したid5を指定すると結果が問題なく返ってきています。
4 updateメソッドの同作確認
- /**
- * Update the specified resource in storage.
- *
- * @param \Illuminate\Http\Request $request
- * @param \App\Models\Novel $novel
- * @return \Illuminate\Http\Response
- */
- public function update(Request $request, Novel $novel)
- {
- $novel->update($request->all());
- return response()->json($novel);
- }
先ほど新規登録したid5を更新処理テストにして実行した所、問題なく更新が実行されました。
5 destroyメソッドの同作確認
- /**
- * Remove the specified resource from storage.
- *
- * @param \App\Models\Novel $novel
- * @return \Illuminate\Http\Response
- */
- public function destroy(Novel $novel)
- {
- $novel->delete();
- return response()->json(Novel::all());
- }
id5を削除するように指定したので、削除された結果が返ってきたことを確認出来ました。
プロフィールに戻る