第3章 タスクの更新と完了
01.ルート設定とテストのためのコントローラ実装
この章では「タスクの更新」機能を実装しよう。
今回は、「タスクの詳細画面」があるので、ここで詳細を表示しつつ更新もできるようにしてみる。 変更できるのは「タスクタイトル」と「実行済みフラグ」とする。
今回も、「ルートの設定」からだ。
タスク更新のためのルート設定
タスクの更新を行なうためには、以下のステップで処理を進めることになる。
- 変更対象のタスク情報表示(Form)
- Formから変更内容を受け付けて更新実施
- 更新済みのタスク情報表示
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)
無事にパスした。
今回も仮実装なので、本当にやりたい処理である「タスクの更新」に関するものが抜けている。 順を追って実装していこう。