第5章 タスクの削除
01.ルート設定とコントローラ実装(タスク削除)
この章では「タスクの削除」機能を実装しよう。
今回も、「ルートの設定」からだ。
タスク削除のためのルート設定
タスクの削除を行なうためには、以下のステップで処理を進めることになる。
- タスクの詳細画面から削除ボタンを押下
- タスクの削除実施
- 一覧画面へ遷移
今回は、詳細画面で削除操作をするようにしている。 2.から3.へ遷移する時は、更新処理の時と同じ要領でリダイレクトを行なおう。
では、タスク削除のためのルートを追加しよう。
routes/web.php
を下記のようにする。
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/tasks', 'TaskController@index');
Route::get('/tasks/{id}', 'TaskController@detail')->where('id', '[0-9]+');
Route::put('/tasks/{id}', 'TaskController@update')->where('id', '[0-9]+');
Route::get('/tasks/new', 'TaskController@new');
Route::post('/tasks', 'TaskController@create');
Route::delete('/tasks/{id}', 'TaskController@remove')->where('id', '[0-9]+');
新規登録を行なうためのルートである、TaskController@remove
を追加した。
今回は削除を行なうので、Route::delete()
メソッドとしている。(HTTPのDELETEメソッドに対応)
また、削除するタスクIDを指定するので、メソッドの後にidの制約条件も記載する。
ルートの確認のためのテスト
ルートを追加したので、テストを書こう。
tests/Feature/TaskControllerTest.php
にテストメソッドを追加する。
<?php
namespace Tests\Feature;
use App\Task;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class TaskControllerTest extends TestCase
{
use RefreshDatabase;
(略)
/**
* Delete Task Path Test
*
* @return void
*/
public function testDeleteTaskPath()
{
$this->assertDatabaseHas('tasks', $this->task->toArray());
$response = $this->delete('/tasks/' . $this->task->id);
$response->assertStatus(302)
->assertRedirect('/tasks/');
$this->assertDatabaseMissing('tasks', $this->task->toArray());
}
}
testDeleteTaskPath()
というテストを実装した。
今回は、testPutTaskPath()
などを元に最初から色々とチェックが入っている。
- 削除前にはデータベースに該当のタスクが入っているか
- 削除実施後に一覧画面へのリダイレクトとなっているか
- 削除実施後にデータベースから該当のタスクが消えているか
というチェックとなっている。
では、実際にテストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
...........F......... 21 / 21 (100%)
Time: 39.73 seconds, Memory: 26.00MB
There was 1 failure:
1) Tests\Feature\TaskControllerTest::testDeleteTaskPath
Expected status code 302 but received 500.
Failed asserting that false is true.
/Users/[ユーザ名]/task-manager/task-manager/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78
/Users/[ユーザ名]/task-manager/task-manager/tests/Feature/TaskControllerTest.php:222
FAILURES!
Tests: 21, Assertions: 58, Failures: 1.
今回も、想定通りに失敗だ。
ルートに対応したコントローラクラスとメソッドの実装
いつも通りにルートに対応したメソッドの仮実装を行なってみよう。
今回はapp/Http/Controllers/TaskController.php
に、remove()
というメソッドを実装する。
<?php
namespace App\Http\Controllers;
use App\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
(略)
public function remove(int $id)
{
return redirect('/tasks');
}
}
仮実装として、今回は一覧ページ(/tasks
)へリダイレクトするようにしてみた。
もう一度テストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
...........F......... 21 / 21 (100%)
Time: 35.06 seconds, Memory: 22.00MB
There was 1 failure:
1) Tests\Feature\TaskControllerTest::testDeleteTaskPath
Failed asserting that a row in the table [tasks] does not match the attributes {
"title": "\u30c6\u30b9\u30c8\u30bf\u30b9\u30af",
"executed": false,
"updated_at": "2018-08-16 23:29:06",
"created_at": "2018-08-16 23:29:06",
"id": 14
}.
Found: [
{
"id": 14,
"title": "\u30c6\u30b9\u30c8\u30bf\u30b9\u30af",
"executed": 0,
"created_at": "2018-08-16 23:29:06",
"updated_at": "2018-08-16 23:29:06"
}
].
/Users/[ユーザ名]/task-manager/task-manager/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithDatabase.php:42
/Users/[ユーザ名]/task-manager/task-manager/tests/Feature/TaskControllerTest.php:225
FAILURES!
Tests: 21, Assertions: 61, Failures: 1.
おっと、失敗したが表示された内容が先ほどとは違っている。
中身を読んでみると、削除実施後にデータベースから該当のタスクが消えているか
のチェックの箇所で
失敗となっていることがわかる。
実際の削除処理を実装していないので、当然といえば当然の結果だ。 というわけで、削除処理をコントローラーに実装しよう。
削除処理をの実装
実装は、それほど難しくない。
app/Http/Controllers/TaskController.php
を、下記のようにしよう。
<?php
namespace App\Http\Controllers;
use App\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
(略)
public function remove(int $id)
{
Task::destroy($id);
return redirect('/tasks');
}
}
68行目にdestroy()
を入れただけだ。
これで、データベースからタスクのデータを削除してくれる。
もう一度、テストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
..................... 21 / 21 (100%)
Time: 43.83 seconds, Memory: 22.00MB
OK (21 tests, 61 assertions)
今度こそ成功だ。
削除の機能は、これで実装できた。 次は画面からの呼び出しだ。