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 を開発する

新規投稿時にユーザIDを記録する

ここではコメントを新規に投稿したときに,認証されたユーザの ID をコメントに記録する機能を作成します.ログイン中(API の場合は認証された)ユーザの情報は Auth::user() で取得できます.次のとおり,コントローラでユーザの情報をコメントに設定するだけです.

app/Http/Controllers/CommentController.php (抜粋)
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

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

class CommentController extends Controller
{

...(中略)...

    public function store(Request $request)
    {
        $user = Auth::user();
        $comment = new Comment();
        $comment->title = $request->title;
        $comment->body = $request->body;
        $comment->user_id = $user->id;
        $comment->save();
        return new CommentResource($comment);
    }

...(以下略)...

コメントを表示する際にユーザのIDも表示するようにリソースを編集します.

app/Http/Resources/CommentResource.php (抜粋)
<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;

class CommentResource extends JsonResource
{
...(中略)...

    /**
     * Transform the resource into an array.
     *
     * @return array<string, mixed>
     */
    public function toArray(Request $request): array
    {
        // return parent::toArray($request);
        return [
            'id' => $this->id,
            'title' => $this->title,
            'body' => $this->body,
            'user_id' => $this->user_id,
            'updated_at' => $this->updated_at->addHours(Carbon::now()->offsetHours),
        ];
    }

前のページでデータベースを一旦ロールバックしました.その関係でトークンもリセットされています.そのことをデータベースを検索して確認します.

sqlite> SELECT * FROM personal_access_tokens; ⏎
sqlite>

ですのでメールアドレスとパスワードを使ってトークンを再発行します.

C:\Users\Rinsaka>curl -X POST -d "email=a@sample.com" -d "password=abc" http://192.168.56.101:8000/api/login/ ⏎
{"user":{"id":1,"name":"A. Sample","email":"a@sample.com","email_verified_at":null,"created_at":"2023-11-02T15:01:01.000000Z","updated_at":"2023-11-02T15:01:01.000000Z"},"token":"1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0"}
C:\Users\Rinsaka>curl -X POST -d "email=b@sample.com" -d "password=abc" http://192.168.56.101:8000/api/login/ ⏎
{"user":{"id":2,"name":"B. Sample","email":"b@sample.com","email_verified_at":null,"created_at":"2023-11-02T15:02:01.000000Z","updated_at":"2023-11-02T15:02:01.000000Z"},"token":"2|mAcqEZVmlUYs9qM4LuuKyWwCihEhfsW0f65M5Bexbcd36bb8"}
C:\Users\Rinsaka>curl -X POST -d "email=c@sample.com" -d "password=abc" http://192.168.56.101:8000/api/login/ ⏎
{"user":{"id":3,"name":"C. Sample","email":"c@sample.com","email_verified_at":null,"created_at":"2023-11-02T15:03:01.000000Z","updated_at":"2023-11-02T15:03:01.000000Z"},"token":"3|q066FpNs1mXXfdEnc1SeUCoGpl3NtjScpPaYZiOt0c9779fe"}
C:\Users\Rinsaka>

上で発行されたトークンを利用してコメントを POST します.すると,使用されたトークンに紐づけられた user_id が正しく保存できていることを確認できました.

C:\Users\Rinsaka>curl -X POST -d "title=a@sample" -d "body=user id test" -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/ ⏎
{"comment":{"id":101,"title":"a@sample","body":"user id test","user_id":1,"updated_at":"2023-12-18T11:22:20.000000Z"}}
C:\Users\Rinsaka>curl -X POST -d "title=b@sample" -d "body=user id test" -H "Authorization: Bearer 2|mAcqEZVmlUYs9qM4LuuKyWwCihEhfsW0f65M5Bexbcd36bb8" http://192.168.56.101:8000/api/comments/ ⏎
{"comment":{"id":102,"title":"b@sample","body":"user id test","user_id":2,"updated_at":"2023-12-18T11:22:27.000000Z"}}
C:\Users\Rinsaka>curl -X POST -d "title=user_c" -d "body=user id test" -H "Authorization: Bearer 3|q066FpNs1mXXfdEnc1SeUCoGpl3NtjScpPaYZiOt0c9779fe" http://192.168.56.101:8000/api/comments/ ⏎
{"comment":{"id":103,"title":"user_c","body":"user id test","user_id":3,"updated_at":"2023-12-18T11:22:32.000000Z"}}
C:\Users\Rinsaka>

念の為にデータベースも検索して確認しておきます.

sqlite> SELECT id, user_id, created_at, updated_at, title FROM comments WHERE id >95; ⏎
id|user_id|created_at|updated_at|title
96|3|2023-10-30 09:02:46|2023-11-07 18:06:19|津田 幹
97|1|2023-10-30 09:03:46|2023-11-16 10:31:00|吉田 知実
98|2|2023-10-30 09:04:47|2023-11-27 23:26:42|田辺 結衣
99|3|2023-10-30 09:05:47|2023-11-14 09:43:07|井上 亮介
100|1|2023-10-30 09:06:48|2023-11-30 16:15:24|宮沢 健一
101|1|2023-12-18 11:22:20|2023-12-18 11:22:20|a@sample
102|2|2023-12-18 11:22:27|2023-12-18 11:22:27|b@sample
103|3|2023-12-18 11:22:32|2023-12-18 11:22:32|user_c
sqlite>

目次に戻る