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 から namestatusdeadline を取り出して、新規作成した $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


まとめ