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ファイルに集約されるのですっきり
ミソ
- フォームの各入力項目は、
form.blade.phpのように共通Bladeに切り出して、各画面から呼び出す - 登録フォームの場合は新しいインスタンスを渡すことで、
Eloquent変数を共通フォームパーツ内で使用できるようにする
(渡さないと登録画面の場合は$user変数なんて知りませんよとエラーが出ちゃう)
登録フォームと編集フォームを共通化して無駄を減らそう