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

ユーザ情報を登録する

ここまでの作業でコメントの表示,投稿,編集,削除など基本機能を備えた API を作成することができました.しかしながら,ユーザの認証を行わない API を世界中に公開し,新規投稿を認め,全てのデータに対して編集や削除などの権限までも与えることは現実的ではありません.API を公開するにあたっては,ユーザの認証を行い,その機能ごとにアクセス権限を与えることが現実的です.例えば,次の典型的な3つのパターンが考えられるでしょう.

典型例 表示 新規投稿 編集・削除
1 認証なしで全てのデータを閲覧可能 認証が必要 認証後,自身の投稿のみ可
2 認証すれば全てのデータを閲覧可能 認証が必要 認証後,自身の投稿のみ可
3 自身の投稿データのみ閲覧可能 認証が必要 認証後,自身の投稿のみ可

ここで登録するユーザの情報は次の表のとおりとします.

# name e-mail password
1 A. Sample a@sample.com abc
2 B. Sample b@sample.com abc
3 C. Sample c@sample.com abc

なお,ユーザが自身で Web からユーザ登録を行い,電子メールで認証するなどの機能も必要になるでしょう.これらの機能の実装はこちらを参照してください.以降の作業では上記のいずれの例にも対応できるように進めていきます.まず,テスト用のユーザ情報を users テーブルに登録するために,シーダを作成します.

vagrant@ubuntu2204 CommentAPI $ php artisan make:seeder UsersTableSeeder ⏎

   INFO  Seeder [database/seeders/UsersTableSeeder.php] created successfully.

vagrant@ubuntu2204 CommentAPI $

database/seeders/UsersTableSeeder.php<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\Models\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        DB::table('users')->delete();
        User::create([
            'name' => 'A. Sample',
            'email' => 'a@sample.com',
            'password' => bcrypt('abc'),
            'created_at' => '2023-11-03 00:01:01',
            'updated_at' => '2023-11-03 00:01:01'
        ]);
        User::create([
            'name' => 'B. Sample',
            'email' => 'b@sample.com',
            'password' => bcrypt('abc'),
            'created_at' => '2023-11-03 00:02:01',
            'updated_at' => '2023-11-03 00:02:01'
        ]);
        User::create([
            'name' => 'C. Sample',
            'email' => 'c@sample.com',
            'password' => bcrypt('abc'),
            'created_at' => '2023-11-03 00:03:01',
            'updated_at' => '2023-11-03 00:03:01'
        ]);
    }
}

次に DatabaseSeeder に UsersTableSeeder 記載して,シーダの実行時にユーザ情報も登録される様にします.なお,後のステップでは users テーブルと comments テーブルにリレーションシップを設定し,comments テーブルには外部キーとして users テーブルの user_id を追加します.したがって,参照整合性の観点から CommentsTableSeeder よりも前に UsersTableSeeder を実行しなければならないことに注意してください.

database/seeders/DatabaseSeeder.php<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // \App\Models\User::factory(10)->create();

        // \App\Models\User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => 'test@example.com',
        // ]);

        $this->call(UsersTableSeeder::class); // この順序に注意
        $this->call(CommentsTableSeeder::class);
    }
}

データベースを一旦ロールバックして,マイグレーション,シードの実行を順に行います.

vagrant@ubuntu2204 CommentAPI $ php artisan migrate:status ⏎

  Migration name ........................................ Batch / Status
  2014_10_12_000000_create_users_table ......................... [1] Ran
  2014_10_12_100000_create_password_reset_tokens_table ......... [1] Ran
  2019_08_19_000000_create_failed_jobs_table ................... [1] Ran
  2019_12_14_000001_create_personal_access_tokens_table ........ [1] Ran
  2023_12_16_135311_create_comments_table ...................... [1] Ran
vagrant@ubuntu2204 CommentAPI $ php artisan migrate:rollback ⏎

   INFO  Rolling back migrations.

  2023_12_16_135311_create_comments_table .................... 10ms DONE
  2019_12_14_000001_create_personal_access_tokens_table ....... 9ms DONE
  2019_08_19_000000_create_failed_jobs_table .................. 8ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ........ 8ms DONE
  2014_10_12_000000_create_users_table ........................ 8ms DONE

vagrant@ubuntu2204 CommentAPI $ php artisan migrate ⏎

   INFO  Running migrations.

  2014_10_12_000000_create_users_table ....................... 17ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ........ 7ms DONE
  2019_08_19_000000_create_failed_jobs_table ................. 16ms DONE
  2019_12_14_000001_create_personal_access_tokens_table ...... 27ms DONE
  2023_12_16_135311_create_comments_table ..................... 8ms DONE

vagrant@ubuntu2204 CommentAPI $ php artisan db:seed ⏎

   INFO  Seeding database.

  Database\Seeders\UsersTableSeeder ............................ RUNNING
  Database\Seeders\UsersTableSeeder ........................ 684 ms DONE

  Database\Seeders\CommentsTableSeeder ......................... RUNNING
  Database\Seeders\CommentsTableSeeder ..................... 754 ms DONE

vagrant@ubuntu2204 CommentAPI $

ユーザの情報が登録されましたが,現時点ではユーザ認証が一切行われていないことも次の手順で確認しておきます.(1) ユーザ情報を与えなくてもコメントを閲覧できます.(2) 正しい認証情報を与えてもコメントを閲覧できます.(3) 不正なパスワードを与えてもコメントを閲覧できる状態です.なお,認証情報は -u オプションの後に「ユーザ名:パスワード」で指定します.

C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/1/ ⏎ # 認証情報なし
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>curl -u a@sample.com:abc http://192.168.56.101:8000/api/comments/1/ ⏎ # 正しい認証情報
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>curl -u a@sample.com:xyz http://192.168.56.101:8000/api/comments/1/ ⏎ # 不正なパスワード
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>

目次に戻る