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

シーダの拡張

これまで3件のコメントデータをテストデータとしてシーダから登録していましたが,これを拡張して100件のコメントが登録されるようにします.シードを増やすためには,database/seeders/CommentsTableSeeder.php に insert を追加するだけです.しかしながら,デタラメなデータを大量に作成するのも骨が折れる作業です.Laravel には Faker というフェイクデータを生成する便利な機能があるのでこれを利用します.

次のとおり,3件のデータに加えてフィクデータを97件追加します.このとき,created_at は ID の順番になるようにし,updated_at は created_at よりもあとのランダムな日時に設定します.


<?php

namespace Database\Seeders;

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

class CommentsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // 一旦中身を削除する
        DB::table('comments')->delete();
        DB::table('comments')->insert([
            'title' => '最初のコメント',
            'body' => '最初のコメントです!',
            'created_at' => '2023-10-02 10:10:10',
            'updated_at' => '2023-10-02 10:10:10'
        ]);
        DB::table('comments')->insert([
            'title' => '2つ目',
            'body' => '2つ目のコメントです!',
            'created_at' => '2023-10-02 10:20:10',
            'updated_at' => '2023-10-02 10:20:10'
        ]);
        DB::table('comments')->insert([
            'title' => '<三個目>のコメント',
            'body' => 'シーダによってテストデータを設定します.',
            'created_at' => '2023-10-02 10:30:10',
            'updated_at' => '2023-10-02 10:30:10'
        ]);

        $i = 0;
        while ($i < 97) {
            // created_at がID順になるような値を作る
            $s = floor($i / 2);    // 秒
            $m = $i % 10;          // 分   10で割った余り
            $h = floor($i / 10);   // 時
            $format = '2023-10-30 %02d:%02d:%02d';
            $created_at = sprintf($format, $h, $m, $s);
            // updated_at はランダムに
            $s = rand(0,59);
            $m = rand(0,59);
            $h = rand(0,23);
            $d = rand(1,30);
            $format = '2023-11-%02d %02d:%02d:%02d';
            $updated_at = sprintf($format, $d, $h, $m, $s);
            DB::table('comments')->insert([
                'title' => fake()->name(),
                'body' => fake()->address() . " / " .  fake()->unique()->safeEmail(),
                'created_at' => $created_at,
                'updated_at' => $updated_at
            ]);
            $i++;
        }
    }
}

データベースを一旦ロールバックし,マイグレーションを実行したのち,シーダを再投入します.このとき,複数のコマンドを ;(コロン)で区切って一気に実行することができます.

vagrant@ubuntu2204 CommentAPI $ php artisan migrate:rollback; php artisan migrate; php artisan db:seed ⏎

   INFO  Rolling back migrations.

  2023_12_16_135311_create_comments_table .................... 25ms DONE
  2019_12_14_000001_create_personal_access_tokens_table ...... 11ms DONE
  2019_08_19_000000_create_failed_jobs_table .................. 7ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ........ 9ms DONE
  2014_10_12_000000_create_users_table ....................... 21ms DONE


   INFO  Running migrations.

  2014_10_12_000000_create_users_table ....................... 33ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ........ 9ms DONE
  2019_08_19_000000_create_failed_jobs_table ................. 20ms DONE
  2019_12_14_000001_create_personal_access_tokens_table ...... 23ms DONE
  2023_12_16_135311_create_comments_table .................... 12ms DONE


   INFO  Seeding database.

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

vagrant@ubuntu2204 CommentAPI $

データベースを操作して,100件のデータが投入されていることを確認します.

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|中村 裕太|1463909  岡山県山本市中央区喜嶋町原田4-8-8 / kobayashi.ryohei@example.org|2023-10-30 00:00:00|2023-11-08 16:50:38
5|渡辺 直子|3201266  長野県青田市中央区山岸町原田1-5-1 / yasuhiro78@example.com|2023-10-30 00:01:00|2023-11-16 06:51:09
6|桐山 直人|3036518  岐阜県斉藤市南区山岸町田中2-8-8 / kekoda@example.com|2023-10-30 00:02:01|2023-11-09 10:07:19

...(中略)...

98|伊藤 幹|9722398  新潟県渚市東区笹田町渚6-9-8 コーポ大垣103号 / haruka11@example.com|2023-10-30 09:04:47|2023-11-12 06:09:23
99|斉藤 舞|7186306  千葉県宮沢市南区桐山町鈴木9-1-5 / yoshida.nanami@example.org|2023-10-30 09:05:47|2023-11-30 02:25:44
100|三宅 結衣|4508690  東京都高橋市西区加納町山口5-5-7 / shuhei92@example.org|2023-10-30 09:06:48|2023-11-07 22:56:49
sqlite>

次に curl コマンドで全てのデータを取得します.

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":"中 村 裕太","body":"1463909  岡山県山本市中央区喜嶋町原田4-8-8 \/ kobayashi.ryohei@example.org","updated_at":"2023-11-08T16:50:38.000000Z"},{"id":5,"title":"渡辺 直子","body":"3201266  長野県青田市中央区山岸町原田1-5-1 \/ yasuhiro78@example.com","updated_at":"2023-11-16T06:51:09.000000Z"},{"id":6,"title":"桐山 直人","body":"3036518  岐阜県斉藤市南区山岸町田中2-8-8 \/ kekoda@example.com","updated_at":"2023-11-09T10:07:19.000000Z"},

...(中略)...

{"id":98,"title":"伊藤 幹","body":"9722398  新潟県渚市東区笹田町渚6-9-8 コーポ大垣103号 \/ haruka11@example.com","updated_at":"2023-11-12T06:09:23.000000Z"},{"id":99,"title":"斉藤 舞","body":"7186306  千葉県宮沢市南区桐山町鈴木9-1-5 \/ yoshida.nanami@example.org","updated_at":"2023-11-30T02:25:44.000000Z"},{"id":100,"title":"三宅 結衣","body":"4508690  東京都高橋市西区加納町山口5-5-7 \/ shuhei92@example.org","updated_at":"2023-11-07T22:56:49.000000Z"}]}
C:\Users\Rinsaka>

現時点では高々100件のデータですが,データ件数が多くなったときに全てのデータを取得することは現実的ではありません.次のページではページネーションを利用して一部のデータだけを取得する機能を実装します.

目次に戻る