第3章 タスクの更新と完了

01.ルート設定とテストのためのコントローラ実装

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

今回は、「タスクの詳細画面」があるので、ここで詳細を表示しつつ更新もできるようにしてみる。 変更できるのは「タスクタイトル」と「実行済みフラグ」とする。

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

タスク更新のためのルート設定

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

  1. 変更対象のタスク情報表示(Form)
  2. Formから変更内容を受け付けて更新実施
  3. 更新済みのタスク情報表示

2.は、Formから受け付けるためのルートを、作らなければならない。 1.と3.は「詳細画面」をルートとして使用すれば良さそうだ。

ちょっと注意したいのは、2.から3.へ遷移をするときだ。 やり方は色々とあるだろうが、今回は2.のルートと3.のルートが異なっている。 そのため、2.の処理が完了したら3.へ「リダイレクト」する必要がある。 HTTPステータスコードの「302 Found」によって、実現させる形になるだろう。

では改めて、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]+');

20行目を追加した。詳細画面を表示するのに使った19行目とほぼ同じだ。

今回は更新処理のため、Route::put()としている(HTTPのPUTメソッドに対応)。 また、実際の処理はupdate()メソッドとした。

ルートの確認のためのテスト

ルートを追加したので、テストを書こう。 tests/Feature/TaskControllerTest.phpにテストメソッドを追加する。















































 
 
 
 
 
 
 
 
 
 
 
 
 


<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class TaskControllerTest extends TestCase
{
    /**
     * Get All Tasks Path Test
     *
     * @return void
     */
    public function testGetAllTasksPath()
    {
        $response = $this->get('/tasks');

        $response->assertStatus(200);
    }

    /**
     * Get Task Detail Path Test
     *
     * @return void
     */
    public function testGetTaskPath()
    {
        $response = $this->get('/tasks/1');

        $response->assertStatus(200);
    }

    /**
     * Get Task Detail Path Not Exists Test
     *
     * @return void
     */
    public function testGetTaskPathNotExists()
    {
        $response = $this->get('/tasks/0');

        $response->assertStatus(404);
    }

    /**
     * Put Task Detail Path Test
     *
     * @return void
     */
    public function testPutTaskPath()
    {
        $data = [];

        $response = $this->put('/tasks/1', $data);

        $response->assertStatus(302);
    }
}

今回はtestPutTaskPath()というテストを実装した。 /tasks/1というパスなので、期待としては「タスクID:1」に対して$dataの内容で更新が可能、、、というテストになる。

では、実際にテストを実行してみよう。

$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

...F...                                                             7 / 7 (100%)

Time: 849 ms, Memory: 20.00MB

There was 1 failure:

1) Tests\Feature\TaskControllerTest::testPutTaskPath
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:58

FAILURES!
Tests: 7, Assertions: 11, Failures: 1.

今回も、いつも通りの失敗だ。

ルートに対応したコントローラクラスとメソッドの実装

というわけで、いつも通りにルートに対応したメソッドの仮実装を行なってみよう。

今回はapp/Http/Controllers/TaskController.phpに、update()というメソッドを実装する。



























 
 
 
 


<?php

namespace App\Http\Controllers;

use App\Task;
use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::all();

        return view('tasks.index', ['tasks' => $tasks]);
    }

    public function detail(int $id)
    {
        $task = Task::find($id);
        if ($task === null) {
            abort(404);
        }

        return view('tasks.detail', ['task' => $task]);
    }

    public function update(int $id)
    {
        return redirect('/tasks/' . $id);
    }
}

先に書いたとおり、詳細画面へのリダイレクト処理を実装している。 テストを実行してみよう。

$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

.......                                                             7 / 7 (100%)

Time: 726 ms, Memory: 14.00MB

OK (7 tests, 11 assertions)

無事にパスした。

今回も仮実装なので、本当にやりたい処理である「タスクの更新」に関するものが抜けている。 順を追って実装していこう。

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