Laravel初心者がLaravelでテストコードを書くまでの勉強メモ（チュートリアルの基本タスクリストの開発にトライ その2）

## 背景

・[前記事の続き](https://qiita.com/shimomai@github/items/b96176deb614e5985662)
・タスク追加、削除処理を追記する

## タスク追加

フォームの用意ができたので、次に追加の処理を記載する。

### バリデーション

タスク名の入力が
・必須
・255文字以下
になるようバリデーションを設定。
タスク追加のルート部分に以下を追記する。

```php:routes/web.php
Route::post('/task', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'name' => 'required|max:255',
    ]);

    if ($validator->fails()) {
        return redirect('/')
            ->withInput()
            ->withErrors($validator);
    }

    // タスク作成処理…
});
```

### タスク作成

入力値をsaveメソッドで保存、その後一覧へリダイレクトするようにする。

```php:routes/web.php
Route::post('/task', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'name' => 'required|max:255',
    ]);

    if ($validator->fails()) {
        return redirect('/')
            ->withInput()
            ->withErrors($validator);
    }

//追記したタスク作成処理
    $task = new Task;
    $task->name = $request->name;
    $task->save();

    return redirect('/');
});
```

### 既存タスク表示

/ルート部分に以下を追記し、タスクは作成日時順に表示する。
view関数は第2引数を使ってビューで使用するデータを渡すことができる。

```php:route/web.php
Route::get('/', function () {
    $tasks = Task::orderBy('created_at', 'asc')->get();

    return view('tasks', [
        'tasks' => $tasks
    ]);
});
```
ビューは前回作成したフォームに、登録したタスクをループで表示する処理を加える。

```html:tasks.blade.php
@extends('layouts.app')
@section('content')
<!-- フォーム -->

    @if (count($tasks) > 0)
        <div class="panel panel-default">
            <div class="panel-heading">
                Tasks
            </div>

            <div class="panel-body">
                <table class="table table-striped task-table">

                    <!-- テーブルヘッダ -->
                    <thead>
                        <th>Task</th>
                        <th>&nbsp;</th>
                    </thead>

                    <!-- テーブル本体 -->
                    <tbody>
                        @foreach ($tasks as $task)
                            <tr>
                                <!-- タスク名 -->
                                <td class="table-text">
                                    <div>{{ $task->name }}</div>
                                </td>

                                <td>
                                    <!-- TODO: 削除ボタン -->
                                </td>
                            </tr>
                        @endforeach
                    </tbody>
                </table>
            </div>
        </div>
    @endif
@endsection

```

## タスク削除

### 削除ボタンの追加

ビューに削除ボタンを設置。

```html:tasks.blade.php
@extends('layouts.app')
@section('content')

<!-- フォームとかタスク一覧とか -->

    <td>
        <form action="{{ url('task/'.$task->id) }}" method="POST">
            {{ csrf_field() }}
            {{ method_field('DELETE') }}

            <button type="submit" class="btn btn-danger">
                <i class="fa fa-trash"></i> Delete
            </button>
        </form>
    </td>
```

### タスク削除

deleteルート部分に以下を追記し、削除処理を行うようにする。

```php:route/web.php
Route::delete('/task/{task}', function (Task $task) {
    $task->delete();

    return redirect('/');
});
```

これで実装完了！
次回からいよいよテストを書く！