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を指定するだけです.

app/Http/Controllers/CommentController.php (抜粋)
    public function update(Request $request, $comment_id)
    {
        $user = Auth::user();
        $comment = Comment::where('user_id', '=', $user->id)
                        ->findOrFail($comment_id);
        $comment->title = $request->title;
        $comment->body = $request->body;
        $comment->save();
        return new CommentResource($comment);
    }

    public function destroy(Request $request, $comment_id)
    {
        $user = Auth::user();
        $comment = Comment::where('user_id', '=', $user->id)
                        ->findOrFail($comment_id);
        $comment->delete();
        return response()->json();
        // return new CommentResource($comment);
    }

コメントを更新する実験を行います.(1) では2番目のユーザが所有者になっているコメントを1番目のユーザのトークンを使って更新しようとしています.その結果エラー (Not Found) になりました.(2) では自身のコメントを更新してその処理が成功しました.

C:\Users\Rinsaka>curl -X PUT -d "title=update" -d "body=body update" -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/2/ ⏎ # (1) 
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Not Found</title>

...(以下略)...

C:\Users\Rinsaka>curl -X PUT -d "title=update" -d "body=body update" -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/1/ ⏎ # (2) 
{"comment":{"id":1,"title":"update","body":"body update","owner":"A. Sample","updated_at":"2023-12-18T12:12:52.000000Z"}}
C:\Users\Rinsaka>

更新後にデータベースを検索すると次の様になりました.最初のコメントが更新され,更新日時も変更されています.一方で2つ目のコメントには変更がありません.

sqlite> SELECT id, user_id, created_at, updated_at, title FROM comments WHERE id < 10; ⏎
id|user_id|created_at|updated_at|title
1|1|2023-10-02 10:10:10|2023-12-18 12:12:52|update
2|2|2023-10-02 10:20:10|2023-10-02 10:20:10|2つ目
3|1|2023-10-02 10:30:10|2023-10-02 10:30:10|<三個目>のコメント
4|1|2023-10-30 00:00:00|2023-11-25 12:29:44|佐々木 直樹
5|2|2023-10-30 00:01:00|2023-11-04 23:59:21|松本 あすか
6|3|2023-10-30 00:02:01|2023-11-24 05:12:28|渡辺 七夏
7|1|2023-10-30 00:03:01|2023-11-15 00:16:14|大垣 和也
8|2|2023-10-30 00:04:02|2023-11-13 17:01:10|石田 太一
9|3|2023-10-30 00:05:02|2023-11-24 20:30:59|鈴木 英樹
sqlite>

次に削除の実験を行います.(3) ではやはり自身が所有者ではないコメントを削除しようとして失敗しています.(4) では自身が所有者であるコメント (id=1) を削除しました.

C:\Users\Rinsaka>curl -X DELETE -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/2/ ⏎ # (3)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Not Found</title>

...(以下略)...

C:\Users\Rinsaka>curl -X DELETE -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/1/ ⏎ # (4)
[]
C:\Users\Rinsaka>

削除後にデータベースを検索します.ID が 1 であるコメントが削除されていることが確認できました.

sqlite> SELECT id, user_id, created_at, updated_at, title FROM comments WHERE id < 10; ⏎
id|user_id|created_at|updated_at|title
2|2|2023-10-02 10:20:10|2023-10-02 10:20:10|2つ目
3|1|2023-10-02 10:30:10|2023-10-02 10:30:10|<三個目>のコメント
4|1|2023-10-30 00:00:00|2023-11-25 12:29:44|佐々木 直樹
5|2|2023-10-30 00:01:00|2023-11-04 23:59:21|松本 あすか
6|3|2023-10-30 00:02:01|2023-11-24 05:12:28|渡辺 七夏
7|1|2023-10-30 00:03:01|2023-11-15 00:16:14|大垣 和也
8|2|2023-10-30 00:04:02|2023-11-13 17:01:10|石田 太一
9|3|2023-10-30 00:05:02|2023-11-24 20:30:59|鈴木 英樹
sqlite>

目次に戻る