Laravelチュートリアル5
step.5では、
・create(新規登録画面)
・store(新規登録処理)
について説明していきます。
create(新規登録画面)とstore(新規登録処理)
create()新規登録画面
新規登録画面のviewを作成します。
resources/views/直下にtasksフォルダにcreate.blade.phpと_form.blade.phpを作成します。
resources/views/tasks/create.blade.php
@extends('layouts.app')
@section('content')
<h3>新規タスク登録</h3>
<hr />
<div class="row">
<div class="col-6">
<form action="{{ route('tasks.store') }}" method="post">
@csrf
@include('tasks._form')
</form>
</div>
</div>
@endsection
共通化
view は基本的には HTML です。
HTML は共通する部分が多くあります。それらを共通化して1つのファイルにまとめます。
_form.blade.php を作成し、
resources/views/tasks/_form.blade.php
<div class="form-group">
<label>ステータス</label>
<select name="status" class="form-control">
@foreach (\App\Enums\Status::getInstances() as $status)
<option value="{{ $status->value }}" {{ $task->$status && $status->value === old('$status', $task->$status->value) ? 'selected' : '' }}>{{ $status->description }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label>名前</label>
<input type="text" name="name" class="form-control" value="{{ old('name', $task->name) }}" />
</div>
<div class="form-group">
<label>期限</label>
<input type="text" name="deadline" class="form-control" value="{{ old('deadline', $task->deadline) }}" />
</div>
<div class="form-group">
<button class="btn btn-primary">保存</button>
</div>
**@include** で共通化することで、記述量やミスも大幅に減少します。
@include('tasks._form')
TaskControllerにcreate()とstore()の処理を書き足したコードです。
<?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', compact('tasks'));
}
public function create()
{
$task = new Task;
return view('tasks.create', compact('task'));
}
public function store(Request $request)
{
$task = new Task;
$task->name = $request->input('name');
$task->status = $request->input('status');
$task->deadline = $request->input('deadline');
$task->save();
return redirect()->route('tasks.index');
}
}
create() は、 POST メソッドを送る入力フォームです。
$task = new Task;
インスタンスを作成しています。
return view('tasks.create', compact('task'));
index()の時と同様にview() で、tasks.createを呼び出しています。
store()新規登録処理
store()は、 送られてきたフォームを処理するところです。
$task = new Task;
インスタンスを作成します。
$task->name = $request->input('name');
$task->status = $request->input('status');
$task->deadline = $request->input('deadline');
送られてきたフォームの内容は $request の中です。
$request から name や status 、deadline を取り出して、新規作成した $task に代入し、
$task->save();
保存します。
store アクションは新規作成後、 / へリダイレクトしています。
index の view から create の view へ遷移できるリンクを作成します。
resources/views/tasks/index.blade.php
@extends('layouts.app')
@section('content')
<h3>タスク一覧</h3>
<hr />
@if (count($tasks) > 0)
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>タスク名</th>
<th>ステータス</th>
<th>期限</th>
<th>更新日時</th>
</tr>
</thead>
<tbody>
@foreach ($tasks as $task)
<tr>
<td>{{ $task->id }}</td>
<td>{{ $task->name }}</a></td>
<td>{{ $task->status}}</td> ->description
<td>{{ $task->deadline}}</td>
</tr>
@endforeach
</tbody>
</table>
@endif
<a href="{{ route('tasks.create') }}" class="btn btn-primary">新規登録</a>
@endsection
まとめ