Posted at

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


背景

前記事の続き

・タスク追加、削除処理を追記する


タスク追加

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


バリデーション

タスク名の入力が

・必須

・255文字以下

になるようバリデーションを設定。

タスク追加のルート部分に以下を追記する。


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メソッドで保存、その後一覧へリダイレクトするようにする。


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引数を使ってビューで使用するデータを渡すことができる。


route/web.php

Route::get('/', function () {

$tasks = Task::orderBy('created_at', 'asc')->get();

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


ビューは前回作成したフォームに、登録したタスクをループで表示する処理を加える。


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



タスク削除


削除ボタンの追加

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


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ルート部分に以下を追記し、削除処理を行うようにする。


route/web.php

Route::delete('/task/{task}', function (Task $task) {

$task->delete();

return redirect('/');
});


これで実装完了!

次回からいよいよテストを書く!