Laravel 10 入門トップページ


目次

  1. API とプロジェクトの概要
  2. プロジェクトの作成と初期設定
  3. データベースのマイグレーション
  4. シーダによるコメントデータの登録
  5. モデルの生成
  6. リソースの生成
  7. GETメソッドを利用した個別コメント取得のAPI作成
  8. 日本語文字列の表示と日時の調整
  9. GETメソッドを利用したコメント一覧取得のAPI作成
  10. データのラップ
  11. POSTメソッドを利用したコメントの新規投稿APIの作成
  12. PUTメソッドを利用したコメント更新APIの作成
  13. DELETEメソッドを利用したコメント削除APIの作成
  14. シーダの拡張
  15. ページネーションの実装
  16. 個別コメントをコントローラで取得
  17. Postman の利用
  18. ユーザ情報を登録する
  19. Sanctum によるユーザ認証
  20. ログインとトークン
  21. コメントとユーザのリレーションシップ
  22. 新規投稿時にユーザIDを記録する
  23. コメントからユーザ名を表示するリレーションシップ
  24. ユーザからコメント一覧を取得するリレーションシップ
  25. 更新と削除の権限設定
  26. 発行済みトークンの取得
  27. トークンの有効期限
  28. レート制限
  29. 閲覧権限の緩和

Laravel で API を開発する

POSTメソッドを利用したコメントの新規投稿APIの作成

ここでは API を通じてコメントを新規に投稿できるように実装します.コメントの新規登録はコントローラで行いたいのでまずはコントローラを作成します.コントローラ名は先頭大文字の単数形または複数形で指定します.今回は単数形で CommentController を指定することにします.

vagrant@ubuntu2204 CommentAPI $ ls app ⏎
Console  Exceptions  Http  Models  Providers
vagrant@ubuntu2204 CommentAPI $ ls app/Http/ ⏎
Controllers  Kernel.php  Middleware
vagrant@ubuntu2204 CommentAPI $ ls app/Http/Controllers/ ⏎
Controller.php
vagrant@ubuntu2204 CommentAPI $ php artisan make:controller CommentController ⏎

   INFO  Controller [app/Http/Controllers/CommentController.php] created successfully.

vagrant@ubuntu2204 CommentAPI $ ls app/Http/Controllers/ ⏎
CommentController.php  Controller.php
vagrant@ubuntu2204 CommentAPI $

生成されたコントローラの中身を確認しておきます.

app/Http/Controllers/CommentController.php<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CommentController extends Controller
{
    //
}

新規投稿のためのルートを定義します.この時,post メソッドを利用していることに注意してください.つまり,/comments という URI に POST メソッドでアクセスされると,CommentController の store 関数が呼び出されることを意味しています.

routes/api.php<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Resources\CommentResource;
use App\Http\Resources\CommentCollection;
use App\Models\Comment;
use App\Http\Controllers\CommentController;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('/comments/{id}', function (string $id) {
    return new CommentResource(Comment::findOrFail($id));
});

Route::get('/comments', function () {
    return new CommentCollection(Comment::get());
});

Route::post('/comments', [CommentController::class, 'store']) -> name('comments.store');

次にコントローラに store 関数を定義します.

app/Http/Controllers/CommentController.php<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Comment;
use App\Http\Resources\CommentResource;

class CommentController extends Controller
{
    public function store(Request $request)
    {
        $comment = new Comment();
        $comment->title = $request->title;
        $comment->body = $request->body;
        $comment->save();
        return new CommentResource($comment);
    }
}

実際に投稿する前に SQLite を操作してデータベースの内容を確認しておきます.シーダで登録したとおり,3件のコメントが登録されていることがわかります.

vagrant@ubuntu2204 database $ sqlite3 database.sqlite ⏎
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
sqlite> .tables ⏎
comments                migrations              personal_access_tokens
failed_jobs             password_reset_tokens   users
sqlite> .headers ON ⏎
sqlite> SELECT * FROM comments; ⏎
id|title|body|created_at|updated_at
1|最初のコメント|最初のコメントです!|2023-10-02 10:10:10|2023-10-02 10:10:10
2|2つ目|2つ目のコメントです!|2023-10-02 10:20:10|2023-10-02 10:20:10
3|<三個目>のコメント|シーダによってテストデータを設定します.|2023-10-02 10:30:10|2023-10-02 10:30:10
sqlite>

実際にクライアントPCから curl コマンドで POST メソッドを利用してデータを送信します.この時,メソッドは -X POST のように -X オプションで指定し,送信したいデータは -d オプションで指定します.登録が成功すると登録されたコメントが表示されます.

C:\Users\Rinsaka>curl -X POST -d "title=title" -d "body=body test" http://192.168.56.101:8000/api/comments/ ⏎
{"comment":{"id":4,"title":"title","body":"body test","updated_at":"2023-12-16T15:03:02.000000Z"}}
C:\Users\Rinsaka>

一覧を取得すると新しいコメントも合わせて表示されました.

C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/ ⏎
{"comments":[{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"},{"id":2,"title":"2つ目","body":"2つ目のコメントです!","updated_at":"2023-10-02T10:20:10.000000Z"},{"id":3,"title":"<三個目>のコメント","body":"シーダによってテストデータを設定します.","updated_at":"2023-10-02T10:30:10.000000Z"},{"id":4,"title":"title","body":"body test","updated_at":"2023-12-16T15:03:02.000000Z"}]}
C:\Users\Rinsaka>

データベースでも確認します.

sqlite> SELECT * FROM comments; ⏎
id|title|body|created_at|updated_at
1|最初のコメント|最初のコメントです!|2023-10-02 10:10:10|2023-10-02 10:10:10
2|2つ目|2つ目のコメントです!|2023-10-02 10:20:10|2023-10-02 10:20:10
3|<三個目>のコメント|シーダによってテストデータを設定します.|2023-10-02 10:30:10|2023-10-02 10:30:10
4|title|body test|2023-12-16 15:03:02|2023-12-16 15:03:02
sqlite>

目次に戻る