第5章 タスクの削除

01.ルート設定とコントローラ実装(タスク削除)

この章では「タスクの削除」機能を実装しよう。

今回も、「ルートの設定」からだ。

タスク削除のためのルート設定

タスクの削除を行なうためには、以下のステップで処理を進めることになる。

  1. タスクの詳細画面から削除ボタンを押下
  2. タスクの削除実施
  3. 一覧画面へ遷移

今回は、詳細画面で削除操作をするようにしている。 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)

今度こそ成功だ。

削除の機能は、これで実装できた。 次は画面からの呼び出しだ。

Last Updated (JST): 7/7/2019, 2:32:08 PM