【Laravel】 登録フォームと編集フォームを共通化する

えびさん

登録フォームと編集フォームを共通化して無駄を減らそう

Controller

  • UserController.php
<?php
namespace App\Http\Controllers;

use App\User;

class UserController extends Controller
{
  private $user;

  public function __construct(User $user) {
    $this->user = $user;
  }

  /**
   * 登録フォーム
   *
   * @return \Illuminate\View\View
   */
  public function create()
  {
    // まだ登録されているuserはないので、空っぽのUserインスタンスをViewに渡す
    $user = $this->user;
    return view('user.create', compact('user'));
  }

  /**
   * 編集フォーム
   *
   * @param User $user
   * @return \Illuminate\View\View
   */
  public function edit(User $user)
  {
    // 登録されているUserデータをViewに渡す
    return view('user.edit', compact('user'));
  }
}

共通フォームパーツのViewをつくる

  • components/form-item.blade.php
<div>
    <label>名前</label>
    <input type="text" name="name" value="{{ old('name', $user->name) }}">
</div>
<div>
    <label>メールアドレス</label>
    <input type="text" name="email" value="{{ old('email', $user->email) }}">
</div>
いくらさん

ディレクトリやファイルの名前は自分の好きなものでOK

例えばuserでディレクトリ切ってるなら、user/form-item.blade.phpにしてみたり

登録フォームつくる

  • create.blade.php
<form action="{{ route('users.store') }}" method="post">
  @csrf
  <!-- 共通フォームパーツ読み出し -->
  @include('components.form-item')

  <button type="submit">登録する</button>
 </form>

更新フォームつくる

  • edit.blade.php
<form action="{{ route('users.update', ['user' => $user]) }}" method="post">
  @method('PUT')
  @csrf
  <!-- 共通フォームパーツ読み出し -->
  @include('components.form-item')

  <button type="submit">更新する</button>
</form>

これでフォーム部分の変更があった場合も1ファイルに集約されるのですっきり

ミソ
  1. フォームの各入力項目は、
    form.blade.phpのように共通Bladeに切り出して、各画面から呼び出す
  2. 登録フォームの場合は新しいインスタンスを渡すことで、
    Eloquent変数を共通フォームパーツ内で使用できるようにする
    (渡さないと登録画面の場合は$user変数なんて知りませんよとエラーが出ちゃう)