ToDo の削除機能を追加します。
画面レイアウトと仕様
タスク編集画面に削除ボタンを設けます。
削除ボタンの仕様は下記になります。
イベント | URL | 備考 |
---|---|---|
削除ボタン | /tasks/{id} |
delete |
削除ボタンをクリックすると、削除要求をサーバ側に送信します。その送信先が、/tasks/{id}
で、送信方法が delete です。
テストケースとテストコード実装
考えられる大まかなテストケースとしては下記になります。
- 指定のテスクが削除されること
- 呼び出し元のタブに戻ること
上記テストケースをコーディングする前にテストケースクラスを作成します。
$ php artisan make:test TaskDeleteTest
生成後にuse RefreshDatabase
など必要なものを追記します。
指定のタスクが削除されること
id を key として、task テーブルからタスクを削除できることを確認します。
public function testDelete()
{
factory(Task::class,1)->state('Ready')->create();
factory(Task::class,1)->state('Doing')->create();
factory(Task::class,1)->state('Done')->create();
$task = factory(Task::class)->state('notReady')->create();
$data =[
'id' => $task->id,
];
//databaseに該当のものが存在することを確認
$this->assertDatabaseHas('tasks', $data);
$response = $this->delete(route('task.delete',$data));
$response->assertRedirect('/');
//databaseに該当のものが存在しないことを確認
$this->assertDatabaseMissing('tasks', $data);
}
テスト実施
テストを実施します。
$ ./vendor/bin/phpunit tests/Feature/TaskDeleteTest.php --testdox
テストはすべてエラーになることを確認します。 テストコードに間違いがある場合は修正します。
実装
router
web.php
に、ルートを追加します。
http メソッドが delete になります。
Route::delete('/tasks/{id}', 'TaskController@destroy')->where('id', '[0-9]+')->name('task.delete');
コントローラ
TaskController に destroy メソッドを追加します。
public function destroy($id)
{
$success = Task::destroy($id);
return redirect(route('home'));
}
画面
削除ボタンをSubmitボタンの左横に追加します。
edit.blade.php
を修正します。
削除ボタンを追加
<div class="d-flex justify-content-end">
<!-- delete 追加 -->
<button class="btn btn-danger me-2" form="delete">Delete</button>
<!-- /delete 追加 -->
<button class="btn btn-primary me-2">Submit</button>
<a class="btn btn-secondary" href="{{route('home') }}">Cancel</a>
</div>
formの追加
@method('DELETE')
の指定が必要なため登録とは別のform
になります。
edit.blade.php
の 最後の方の</form>
と@endsection
の間に追加します。
</form>
<!-- form 追加 -->
<form id="delete" method="POST" action="{{ route('task.delete',['id'=>$task->id]) }}">
@method('DELETE')
@csrf
</form>
@endsection
テスト
$ ./vendor/bin/phpunit tests/Feature/TaskDeleteTest.php --testdox
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.
Task Delete (Tests\Feature\TaskDelete)
✔ Delete
Time: 937 ms, Memory: 34.01 MB
OK (1 test, 4 assertions)
念のためブラウザテストを行っておきます。
$ php artisan dusk tests/Browser/EditTaskTest.php
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 8.94 seconds, Memory: 34.01 MB
OK (3 tests, 5 assertions)