第一章8 『Labelモデルに関わるコントローラーの作成』
2022/04/4 Laravel
前回Todoに関わるコントローラーを作ったので今回はLabelに関わるコントローラーを作っていく。
routes/api.phpにLabel用のルーティングを追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php declare(strict_types=1); use App\Http\Controllers\Api\Label\CreateLabelController; use App\Http\Controllers\Api\Label\DeleteLabelsController; use App\Http\Controllers\Api\Label\GetLabelsController; use App\Http\Controllers\Api\Label\UpdateLabelController; use App\Http\Controllers\Api\Todo\CreateTodoController; use App\Http\Controllers\Api\Todo\DeleteTodoController; use App\Http\Controllers\Api\Todo\GetTodosController; use App\Http\Controllers\Api\Todo\UpdateTodoController; use Illuminate\Support\Facades\Route; Route::get('todos', GetTodosController::class); Route::post('todo', CreateTodoController::class); Route::put('todo/{id}', UpdateTodoController::class); Route::delete('todo/{id}', DeleteTodoController::class); Route::get('labels', GetLabelsController::class); Route::post('label', CreateLabelController::class); Route::put('label/{id}', UpdateLabelController::class); Route::delete('label/{id}', DeleteLabelsController::class); |
app/Http/Controllers/Api/Label/CreateLabelController.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php declare(strict_types=1); namespace App\Http\Controllers\Api\Label; use App\Http\Controllers\Controller; use App\Services\Label\CreateLabelService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; class CreateLabelController extends Controller { /** * @param Request $request * @param CreateLabelService $createLabelService * @return JsonResponse */ public function __invoke(Request $request, CreateLabelService $createLabelService): JsonResponse { return response()->json($createLabelService->__invoke($request->title)); } } |
app/Http/Controllers/Api/Label/DeleteLabelsController.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php declare(strict_types=1); namespace App\Http\Controllers\Api\Label; use App\Http\Controllers\Controller; use App\Services\Label\DeleteLabelService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; class DeleteLabelsController extends Controller { /** * @param int $id * @param DeleteLabelService $deleteLabelService * @return JsonResponse */ public function __invoke(int $id, DeleteLabelService $deleteLabelService): JsonResponse { return response()->json($deleteLabelService->__invoke($id)); } } |
app/Http/Controllers/Api/Label/GetLabelsController.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php declare(strict_types=1); namespace App\Http\Controllers\Api\Label; use App\Http\Controllers\Controller; use App\Services\Label\GetLabelsService; use Illuminate\Http\JsonResponse; class GetLabelsController extends Controller { /** * @param GetLabelsService $getLabelsService * @return JsonResponse */ public function __invoke(GetLabelsService $getLabelsService): JsonResponse { return response()->json($getLabelsService->__invoke()); } } |
app/Http/Controllers/Api/Label/UpdateLabelController.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php declare(strict_types=1); namespace App\Http\Controllers\Api\Label; use App\Http\Controllers\Controller; use App\Services\Label\UpdateLabelService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; class UpdateLabelController extends Controller { /** * @param int $id * @param Request $request * @param UpdateLabelService $updateLabelService * @return JsonResponse */ public function __invoke(int $id, Request $request, UpdateLabelService $updateLabelService): JsonResponse { return response()->json($updateLabelService->__invoke($id, $request->title)); } } |
テストを作成する。
1 2 3 4 |
todo-list % sail artisan make:test Label/CreateLabelControllerTest todo-list % sail artisan make:test Label/GetLabelsControllerTest todo-list % sail artisan make:test Label/UpdateLabelControllerTest todo-list % sail artisan make:test Label/DeleteLabelControllerTest |
tests/Feature/Label/CreateLabelControllerTest.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php declare(strict_types=1); namespace Tests\Feature\Label; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Testing\Fluent\AssertableJson; use Tests\TestCase; class CreateLabelControllerTest extends TestCase { use RefreshDatabase; public function testExec() { $response = $this->post('api/label', ['title' => 'Test']); $response ->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json ->has('id') ->where('title', 'Test') ->has('created_at') ->has('updated_at') ); } } |
tests/Feature/Label/DeleteLabelControllerTest.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php declare(strict_types=1); namespace Tests\Feature\Label; use App\Models\Label; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class DeleteLabelControllerTest extends TestCase { use RefreshDatabase; public function testExec() { $label = new Label(); $label->title = 'Test'; $label->save(); $response = $this->delete("api/label/$label->id"); $response->assertStatus(200); $this->assertDatabaseMissing('labels', ['id' => $label->id]); } } |
tests/Feature/Label/GetLabelsControllerTest.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php declare(strict_types=1); namespace Tests\Feature\Label; use App\Models\Label; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Testing\Fluent\AssertableJson; use Tests\TestCase; class GetLabelsControllerTest extends TestCase { use RefreshDatabase; public function testExec() { $titles = ['Test1', 'Test2', 'Test3']; foreach ($titles as $title) { $label = new Label(); $label->title = $title; $label->save(); } $response = $this->get('api/labels'); $response ->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json->has((string)2) ->first(fn ($json) => $json ->has('id') ->has('title') ->has('created_at') ->has('updated_at') ) ); } } |
tests/Feature/Label/UpdateLabelControllerTest.phpを以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php declare(strict_types=1); namespace Tests\Feature\Label; use App\Models\Label; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Testing\Fluent\AssertableJson; use Tests\TestCase; class UpdateLabelControllerTest extends TestCase { use RefreshDatabase; public function testExec() { $label = new Label(); $label->title = 'Test'; $label->save(); $response = $this->put("api/label/$label->id", ['title' => 'Update']); $response ->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json ->where('id', $label->id) ->where('title', 'Update') ->has('created_at') ->has('updated_at') ); } } |
テストを実行。
1 |
todo-list % sail artisan test |
こんな感じになればOK。
これでコントローラー周りは終わりかも。