ここでは 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>